多态: 同一个对象,在不同时刻表现出来的不同形态。
计算机运行时,相同的动作可能会在多个不同的类别对象,系统可根据不同类别中的对象,引发对应类别的方法,而有不同的行为。
举例: 猫
通常我们说:猫 cat = new 猫();
多态中说:动物 animal = new 猫();
这里的猫在上面表现的是猫态,下面表现的是动物态,这就是多态。
多态的前提和体现:
a、有继承/实现关系
b、有方法重写
c、有父类引用指向子类对象[例:动物 animal = new new 猫();]
多态中成员访问特点:
成员变量: 编译看左边,执行看左边
成员方法: 编译看左边,执行看右边
为什么成员方法和成员变量不一样: 成员方法有重写,成员变量则没有。
多态中的转型:
向上转型 从子到父、父类引用指向子类对象:[动物 animal = new Cat();]
向下转型 从父到子、父类引用转为子类对象: [Cat c = (Cat)animal;]
e.g.:Animal(父类) AnimalOperator(操作方法类) Cat(子类) Dog(子类) ploy_Demo(main)
Animal(父类):
public class Animal {
public void eat(){
System.out.println("动物吃东西");
}
}
AnimalOperator(操作方法类):
public class AnimalOperator {
public void useAnimal(Animal a){
// 编译看左边,运行看右边; 使用父类型作为参数,调用的时候使用子类型
// Animal a = new Cat();
// Animal a = new Dog();
a.eat();
}
}
Cat(子类):
public class Cat extends Animal{
@Override
public void eat() {
System.out.println("猫吃鱼");
}
}
Dog(子类):
public class Dog extends Animal{
@Override
public void eat() {
System.out.println("狗吃肉");
}
}
ploy_Demo(main):
public class ploy_Demo {
public static void main(String[] args) {
//创建动物操作类的对象,调用方法
AnimalOperator ao = new AnimalOperator();
Cat c = new Cat();
ao.useAnimal(c);
Dog d = new Dog();
ao.useAnimal(d);
}
}
运行结果:
猫吃鱼
狗吃肉