多态: 同一种事物,在不同时刻表现不同的状态
Java编程中多态存在的三个必要条件
要有继承(包括接口的实现)要有方法重写父类引用指向子类对象多态:编译看左边,运行看右边
package Polymorphism; /* * 测试类 * */ public class Test { public static void main(String[] args) { // 定义动物类---父类引用指向子类对象 Animal animal = new Dog(); // 编辑时调用Animal的方法,运行时调用Dog的方法 // 即编辑看左边,运行看右边(非静态成员方法) animal.eat();// 执行Dog(子类)中重写Animal(父类)中的eat方法 // 对于静态方法:编辑看左边,运行也看左边 // 因为静态方法属于类 Animal.sleep(); // 变量不存在被子类覆写这一说法,只有方法存在覆写。 // 非静态成员变量(编译看左边,运行看左边) System.out.println(animal.number+"::"+animal.animal); // 注意:子类可以访问父类中的非私有成员变量 Dog dog = (Dog)animal;// 强制类型转换为Dog System.out.println("dog对象中访问成员变量"+dog.number+"::"+dog.animal+"::"+dog.dog); // 静态成员变量(编译看左边,运行看左边) System.out.println(animal.num+"::"+dog.num); } }运行结果:
Dog eat Animal sleep 1::11 dog对象中访问成员变量2::11::22 10::20在编程时一般情况下提倡 低耦合,高聚合。也就是降低联系,增强独立。
向上转型:子类类型转换为父类类型 小类型 转 大类型(可以直接转换)
向下转型:把父类类型转换为子类类型 大类型 转 小类型(需要强制类型转换)
在上面最后的案例中,我们发现当父类中有该方法,并且子类中重写该方法时,有编辑看左边,运行看右边。
但是当父类中没有子类的特有方法时,该如何调用???
转型(该案例只是说明向下转型) package Polymorphism; /* * 多态中的类型转换 * * */ public class Demo { public static void main(String[] args) { //创建狗类对象 Animal dog = new Dog(); //创建该类对象 Demo demo = new Demo(); //非静态方法通过对象名调用 demo.feed(dog); } // 封装方法 public void feed(Animal animal) { // 调用子类重写了父类的方法 // 在编译期间调用的是父类中的方法,但是由于子类重写了eat方法,在实际运行时,会调用子类中的eat方法 animal.eat(); // 当只调用子类中的方法时 // 需要类型装换 Dog dog = (Dog)animal; // 向下转型后通过对象名调用方法 dog.function(); } }运行结果:
Dog eat Dog function