目录
同一个对象,在不同时刻表现出来的不同形态
举例:猫
我们可以说猫是猫:猫cat=new猫();
我们也可以说猫是动物:动物animal=new猫0;
这里猫在不同的时刻表现出来了不同的形态,这就是多态
多态的前提和体现
有继承/实现关系有方法重写
有父类引用指向子类对象
代码演示:
动物类:
package zyy02; public class Animal { public void eat(){ System.out.println("动物吃东西"); } }猫类:
package zyy02; public class Cat extends Animal{ @Override public void eat() { System.out.println("猫吃鱼"); } }测试类:
package zyy02; public class Demo { public static void main(String[] args) { Animal a=new Cat(); } }
成员变量:编译看左边,执行看左边
成员方法:编译看左边,执行看右边
为什么成员变量和成员方法的访问不一样呢?
因为成员方法有重写,而成员变量没有
代码演示:
动物类:
package zyy02; public class Animal { public int age=18; public void eat(){ System.out.println("动物吃东西"); } }猫类:
package zyy02; public class Cat extends Animal{ public int age=14; public int weight=100; @Override public void eat() { System.out.println("猫吃鱼"); } public void playGame(){ System.out.println("猫捉迷藏"); } }测试类:
package zyy02; public class Demo { public static void main(String[] args) { Animal a=new Cat(); System.out.println(a.age); //System.out.println(a.weight); a.eat(); //a.playGame(); } }运行结果:
多态的好处:提高了程序的扩展性
具体体现:定义方法的时候,使用父类型作为参数,将来在使用的时候,使用具体的子类型参与操作
多态的弊端:不能使用子类的特有功能
向上转型
从子到父
父类引用指向子类对象向下转型
从父到子
父类引用转为子类对象
代码演示:
package zyy02; public class Demo { public static void main(String[] args) { Animal a=new Cat();//向上转型 a.eat(); //a.playGame; //创建Cat类对象 Cat c=new Cat(); c.eat(); c.playGame(); //向下转型 Cat c1=(Cat)a; c1.eat(); c1.playGame(); } }