多态:
同一对象,在不同时刻表现出来的不同形态。
多态的前提和体现:
有继承/实现关系
有方法重写
有父类引用指向子类对象
多态中成员访问特点:
成员变量:编译看左边,执行看左边
成员方法:编译看左边,执行看右边
成员变量和成员方法的访问不一样的原因:成员方法有重写,而成员变量没有
多态的好处:
提高了程序的扩展性
(定义方法的时候,使用父类型作为参数,使用时,使用具体的子类型参与操作)
package learn;
public class Animal {
public void eat(){
System.out.println("动物吃东西");
}
}
package learn;
public class Cat extends Animal{
@Override
public void eat() {
System.out.println("猫吃鱼");
}
}
package learn;
public class Dog extends Animal{
@Override
public void eat() {
System.out.println("狗吃骨头");
}
}
package learn;
public class AnimalOperator {
public void useAnimal(Animal a){
//Animal a=new Cat();
//Animal a=new Dog();
a.eat();
}
}
package learn;
public class TestDemo {
public static void main(String[] args){
AnimalOperator ao=new AnimalOperator();
Cat c=new Cat();
ao.useAnimal(c);
Dog d=new Dog();
ao.useAnimal(d);
}
}
多态的弊端:
不能使用子类的特有功能(编译看左边)
多态中的转型:
向上转型:
从子到父
父类引用指向子类对象
向下转型:
从父到子
父类引用转为子类对象
package learn;
public class Animal {
public void eat(){
System.out.println("动物吃东西");
}
}
package learn;
public class Cat extends Animal{
@Override
public void eat() {
System.out.println("猫吃鱼");
}
public void PlayGame(){
System.out.println("猫捉迷藏");
}
}
package learn;
public class TestDemo {
public static void main(String[] args){
Animal a=new Cat();//向上转型
a.eat();
//a.PlayGame;(编译错误)
Cat c=(Cat)a;//向下转型
c.eat();
c.PlayGame();
}
}