/* 多态的前提: 有继承/实现关系 有方法重写 有父类引用指向子类对象 1.对象多态 Animal a = new Dog(); Animal a = new Cat(); 用处:方法的形参定义为父类类型,这个方法便可以接收到该父类的任意子类对象了 2.行为多态 a.eat(); Dog.eat(); Cat.eat(); 用处:同一个方法,具有多种不同表现形式,或形态的能力 */ public class PolymorphismTest { public static void main(String[] args) { useAnimal(new Dog()); //Animal a = new Dog(); //狗吃肉... useAnimal(new Cat()); //Animal a = new Cat(); //猫吃鱼... } public static void useAnimal(Animal a) { a.eat(); } } abstract class Animal { public abstract void eat(); } class Dog extends Animal { @Override public void eat() { System.out.println("狗吃肉..."); } } class Cat extends Animal { @Override public void eat() { System.out.println("猫吃鱼..."); } }
/* 多态的成员访问特点: 1.成员变量:编译看左边(父类),运行看左边(父类) 2.成员方法:编译看左边(父类),运行看右边(zi类) 在编译的时候会检查父类中有没有这个方法 没有:编译错误 有:编译通过,但是运行的时候,一定会执行子类的方法逻辑 ------------------------------------------------------------------ 多态创建对象,调用静态成员: 静态的成员推荐通过类名进行调用 即使通过对象名调用,也是转化为类名调用 ------------------------------------------------------------------ 多态的好处: 提高了程序的扩展性 多态的弊端: 不能使用子类的特有成员 */ public class PolymorphismTest { public static void main(String[] args) { Fu f = new Zi(); System.out.println(f.num); //成员变量多态演示 //10 f.show(); //成员方法多态演示 //Zi...show f.print(); //Fu.print(); //多态创建对象,调用静态成员 //Fu...print System.out.println("-------------------------"); Inter i = new InterImpl(); i.method(); //method... } } class Fu{ int num = 10; public void show(){ System.out.println("Fu...show"); } public static void print(){ System.out.println("Fu...print"); } } class Zi extends Fu{ int num = 20; public void show(){ System.out.println("Zi...show"); } public static void print(){ System.out.println("Zi...print"); } } interface Inter{ void method(); } class InterImpl implements Inter{ @Override public void method() { System.out.println("method..."); } }