多态:同一个对象在不同时刻表现出不同的形态
多态实现的前提条件:
- 有继承/实现关系
- 有方法的重写
- 有父类引用指向子类对象
举例:猫
我们可以说猫是猫:猫 cat = new 猫();
也可以说猫是动物:动物 animal = new 猫();
这里的猫在不同时刻表现出不同形态,就是多态
public class Animal {
public int age = 40;
public void eat(){
System.out.println("动物正在吃");
}
}
public class Cat extends Animal{
public int age = 20;
public int weight = 30;
@Override
public void eat() {
System.out.println("猫吃鱼");
}
public void playGame(){
System.out.println("猫玩球");
}
}
public class Demo {
public static void main(String[] args) {
//父类引用指向子类对象
Animal a = new Cat();
System.out.println(a.age);//输出结果是40,也就是说通过多态访问的是父类的属性
a.eat();//输出结果是:猫吃鱼
/*为什么访问成员变量使用的是父类的变量,而访问成员方法使用的是子类的方法?
因为方法在子类中被重写了。*/
/*下面会报错,多态不能访问子类独有的属性和方法
System.out.println(a.weight);
a.playGame();
因为多态访问方法编译时会看左边,左边没有的属性和方法不能被使用
*/
useAnimal(new Animal());
useAnimal(new Cat());//相当于Animal a = new Cat(); useAnimal(a);
useAnimal(new Dog());
}
public static void useAnimal(Animal a){
a.eat();
}
/*上面代码等价于下面:
public static void useAnimal(Cat cat){
cat.eat();
}
public static void useAnimal(Dog dog){
dog.eat();
}
使用了多态以后我们就可以使用父类对象直接使用子类重写的方法,节约代码
如果以后还有猪等动物也不用重复写代码了
* */
}
}