多态: 同一个对象,在不同时刻表现出的不同形态
- 举例:猫
我们可以说猫是猫:猫 cat = new 猫();
我们也可以说猫是动物:动物 animal=new 猫();
这里猫在不同时刻表现出不同的状态,这就是多态
- 多态的前提和实现:
- 有继承/实现关系
- 有方法重写
- 有父类引用指向子类对象
-
多态的好处:
- 定义方法的时候,使用父类型作为参数,将来在使用的时候,使用具体的子类型参与操作
-
多态的弊端:
- 不能使用子类的特有功能
下面看代码
animal类:
public class animal {
public int age=40;
public void eat() {
System.out.println("动物吃东西");
}
}
cat类: 对animal进行重写
public class cat extends animal {
public int age=20;
public int weight=10;
@Override
public void eat() {
// TODO Auto-generated method stub
System.out.println("猫吃鱼");
}
public void playgame() {
System.out.println("猫捉迷藏");
}
}
dog类: 对animal进行重写
public class dog extends animal {
@Override
public void eat() {
System.out.println("狗吃骨头");
}
}
animalOperation类:
public class animalOperation {
public void useAnimal(cat c) {
c.eat();
}
public void useAnimal(dog d) {
d.eat();
}
}
}
main方法:
public class animalDemo {
public static void main(String[] args) {
//有父类引用指向子类对象
animal a=new cat();
//多态访问成员变量编译和运行都要看animals有没有
System.out.println(a.age);//输出40
//多态访问成员方法编译看左边,运行看右边
a.eat();
//创建动物操作类对象,调用方法
animalOperation ao=new animalOperation();
cat c=new cat();
ao.useAnimal(c);
dog d=new dog();
ao.useAnimal(d);
}
}
这里需要注意一点多态对成员变量以及成员方法的访问方式!!
比如这里创建一个多态类,左边是animal类,右边cat类是animal类的子类
animal a=new cat();
-
此时多态访问成员变量的时候,无论是编译还是运行看的都是animal类中有没有,因此访问成员变量时,编译和运行都是看左边
-
多态访问成员方法的时候,编译看的是animal,运行看的是cat,也就是说,编译的时候看的是左边animal有没有这个方法,运行的时候看的是右边cat中的方法,因此访问成员方法时,编译看左边,运行看右边
而多带的好处就在于:定义方法的时候,使用父类型作为参数,将来在使用的时候,使用具体的子类型参与操作
可以看到上边的animalOperation类中每定义一个新类时,都需要对该类进行方法重写,而多态正是解决了这个问题,可以把上边代码改为这样,参数直接用父类即可,而调用的时候可直接使用子类进行调用。
public class animalOperation {
public void useAnimal(animal a) {
//等同于animal a=new cat();
//animal a=new dog();
a.eat();
}
}