先说说封装:
用new 一条狗来举个例子:
1 public class Dog { 2 3 //私有化字段 4 private String name; 5 private int age; 6 //无参构造 7 Dog(){ 8 9 } 10 //带参构造 11 Dog(String name,int age){ 12 this.name = name; 13 this.age = age; 14 } 15 //setter and getter 方法 16 public String getName() { 17 return name; 18 } 19 public void setName(String name) { 20 this.name = name; 21 } 22 public int getAge() { 23 return age; 24 } 25 public void setAge(int age) { 26 this.age = age; 27 } 28 29 }
私有化成员变量后就不能直接使用 object.name 的形式改变字段值了。可以使用构造函数初始化字段值或者使用getter setter方法获取、改变字段值。
1 public class MyMain { 2 3 public static void main(String[] args) { 4 5 Dog dog = new Dog("旺旺", 3);//创建Dog对象并初始化dog:旺旺,3 6 Dog dog2 = new Dog(); 7 dog2.setName("张三");//使用setter方法 8 dog2.setAge(15);//dog2:张三,15 9 } 10 11 }
然后是继承:
父类是Pet 类:
1 public abstract class Pet { 2 3 private String name; 4 private int age; 5 6 public Pet(String name, int age) { 7 super(); 8 this.name = name; 9 this.age = age; 10 } 11 public Pet(){ 12 print();//虽然编译不报错,但是最好不要这么写,父类构造中调用可被子类覆盖的方法破坏封装 13 } 14 public String getName() { 15 return name; 16 } 17 public void setName(String name) { 18 this.name = name; 19 } 20 public int getAge() { 21 return age; 22 } 23 public void setAge(int age) { 24 this.age = age; 25 } 26 27 public abstract void print();//抽象类可以有抽象方法和非抽象方法,但是非抽象类不能有抽象方法;抽象方法不是类方法,不能用static修饰 28 29 abstract int calc(int i) throws ArithmeticException;//测试子类抛出异常范围 30 31 }
子类是Penguin 类:
1 public class Penguin extends Pet{ 2 3 private int love; 4 5 public Penguin(String name, int age, int love) { 6 super(name, age); 7 this.love = love; 8 } 9 public Penguin(){ 10 super(); 11 } 12 13 public int getLove() { 14 return love; 15 } 16 17 public void setLove(int love) { 18 this.love = love; 19 } 20 21 @Override//方法名相同,参数列表相同,返回值类型相同 22 public void print() {//子类重写父类方法不能减少其访问权限,这里使用非public会报错 23 //原因:父类引用指向子类对象,如果子类方法访问权限少,那么将会导致方法调用者可调用父类方法却不能调用子类的重写方法. 24 // TODO Auto-generated method stub 25 System.out.println("我是:"+this.getName()+"年龄:"+this.getAge()+"健康值"+this.getLove()); 26 } 27 @Override 28 int calc(int i) throws ArithmeticException{//子类重写父类方法不能抛出更多的异常,这里抛出Exception或其他异常会报错 29 //原因:父类引用指向子类对象,如果子类抛出更多的异常,那么将会导致方法调用者try-catch父类异常时忽略了子类更多的异常(catch不到) 30 // TODO Auto-generated method stub 31 return 1/i; 32 } 33 34 }
测试类:
1 public class MyMain { 2 3 public static void main(String[] args) { 4 Pet penguin = new Penguin();//父类变量 指向 子类对象,父类引用 指向 子类对象;向上转型(子类转父类) 5 penguin.setName("张三"); 6 penguin.setAge(18); 7 penguin.print();//多态 8 //penguin.setLove(100);报错,只能调用父类方法表中的方法 9 Penguin p = (Penguin)penguin;//向下转型(父类转子类) 10 p.setLove(100); 11 penguin = (Pet)p;//向上转型 12 penguin.print(); 13 p = (Penguin)penguin;//向下转型 14 p.print(); 15 penguin = new Penguin("小企鹅", 6, 100); 16 penguin.print(); 17 int t; 18 try { 19 t = penguin.calc(0); 20 System.out.println(t); 21 } catch (ArithmeticException e) { 22 // TODO Auto-generated catch block 23 //e.printStackTrace(); 24 System.out.println("除数不能是0!"); 25 } 26 System.out.println("end .."); 27 } 28 }
最后说说多态,
上面代码第4行Pet penguin = new Penguin();已经体现了多态,再写个多态的典型例子——主人给宠物喂食:
1 public class MyMain { 2 3 public static void main(String[] args) { 4 5 Pet dog = new Dog(); 6 Pet cat = new Cat(); 7 Person.feeding(dog); 8 Person.feeding(cat); 9 } 10 11 } 12 13 public abstract class Pet { 14 15 public abstract void eat(); 16 17 } 18 public class Dog extends Pet { 19 20 @Override 21 public void eat() { 22 // TODO Auto-generated method stub 23 System.out.println("够吃骨头..."); 24 } 25 26 } 27 public class Cat extends Pet { 28 29 @Override 30 public void eat() { 31 // TODO Auto-generated method stub 32 System.out.println("猫吃鱼..."); 33 } 34 35 } 36 public class Person { 37 38 public static void feeding(Pet pet) { 39 // TODO Auto-generated method stub 40 pet.eat(); 41 } 42 43 }
附上思维导图: