多态概述
同一个对象,在不同时刻表现出来的不同形态
举例:猫
我们可以说猫是猫:猫 cat = new 猫();
我们也可以说猫是动物:动物 animal = nwe 动物();
这里猫在不同的时刻表现出来了不同的形态,这就是多态
多态的前提和体现
- 有继承/实现关系
- 有方法重写
- 有父类引用指向子类对象
创建一个animal
public class animal {
public void eat(){
public int age = 40;
System.out.println("动物吃东西");
}
}
创建一个cat
public class cat extends animal{
public int age = 20;
public int weight = 10;
@Override
public void eat(){
System.out.println("猫吃鱼");
}
public void playGame(){
System.out.println("猫捉迷藏");
}
}
main
public class Demo {
public static void main(String[] args){
//父类引用指向子类对象
animal a = new cat();
}
}
多态中成员访问特点
承接上述代码
访问成员变量时
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();//报错
}
}
将weight、playGame注释掉后,运行:
40 猫吃鱼
可以看出:
在访问成员变量时,是访问左边(weight)的。
在访问成员方法时,是访问右边(cat)的。
简单说:
- 成员变量:编译看左边,执行看左边
- 成员方法:编译看左边,执行看右边
为什么不一样?
成员方法有重写,成员变量没有。
多态中的转型
-
向上转型
从子到父
父类引用指向子类对象 -
向下转型
从父到子
父类引用转为子类对象
animal a = new cat();//向上转型 a.eat();//打印:猫吃鱼 a.playGame();//报错 cat c = (cat)a;//强制转化为cat,这就是向下转型 c.eat();//打印:猫吃鱼 c.playGame();//打印:猫捉迷藏



