多态
1.1 多态概述
同一个对象,在不同时刻表现出来的不同形态
举例:猫
我们可以说猫是猫:猫 cat = new 猫();
也可以说猫是动物:动物 animal = new 猫();
这里猫在不同的时刻表现出了不同的形态,这就是多态
多态的前提和实现
●有继承/实现关系
●有方法重写
●有父类引用指向子类对象
1.2 多态中成员访问特点
●成员变量:编译看左边,执行看左边
●成员方法:编译看左边,执行看右边
以上两点具体表现为:
Aniimal mao = new Cat();
mao.成员变量 可以访问到Animal中的成员变量,而与Cat类无关
mao.成员方法 可以访问到Animal中的成员方法,却访问不到Cat类的成员方法, 如果有在Cat类中对Animal类中的个别方法进行重写,那么就执行重写后的方法。
1.3 多态的好处和弊端
●多态的好处:提高了程序的扩展性
具体体现:定义方法的时候,使用父类型作为参数,将在在使用时,使用具体的子类型参与操作
●多态的弊端:不能使用子类的特有功能
举例:Animal是父类,Cat、Dog都是子类,Animal类有一个eat方法,Cat、Dog都对eat进行了重写
随便定义一个方法,调用Dog.eat方法,Cat.eat方法
public void useAnimal(Dog d){
d.eat();
}
public void useAnimal(Cat c){
c.eat();
}
定义完毕,这是只有两种动物,所以只用重载1次,但是倘若有n种动物都要调用自身的eat方法,岂不是要重载n-1次
所以,使用多态,将那n-1次重载免去,如下:
public void useAnimal(Animal a){
a.eat();
}
完毕,这下只要是继承了Animal的类,只要在自己的类里对eat类重写一下,就能通过这个方法来调用***.eat方法
1.4 多态的转型
●向上转型
从子到父
父类引用指向子类对象
●向下转型
从父到子
父类引用转为子类对象
public static void main(String[] args) {
Animal a = new Cat(); //这就称为向上转型 子类到父类
a.eat();
Cat c = (Cat)a; //这是向下转型 父类赋值给子类 注意这个赋值,它还会把a的成员变量也赋值给c
c.playGame();
c.eat();
}
只能父类与子类之间转换,倘若无关系的或同为子的两个类转化会报错,出现ClassCastException 类型转换异常