一,多态的理解及实现方式
多态使用前提:类的继承 , 方法的重写
可以理解为一个事物的多种形态
1)父类的引用指向子类的对象
2)子类的对象付给父类的引用
举例:person p = new Man( );
public void func(Animal animal){//Animal animal = new Dog
animal.eat();
animal.shout();
}
三,多态的使用,虚拟方法的调用
有了对象的多态性以后,我们编译期只能调用父类中声明的方法,但在运行期,我们实际执行的是子类重写父类的方法
编译看左边,运行看右边
注意:对象的多态性只适应与方法,不适用于属性
四,向下转型
有了对象的多态性以后,内存中实际上是加载了子类特有的属性和方法的,但是由于变量声明为父类类型,导致编译时,只能调用父类中声明的属性和方法。子类特有的属性和方法不能调用。如何才能调用子类特的属性和方法?使用向下转型。
例:Pet pet = new Dog(“欧欧”, “雪纳瑞");
Dog dog = (Dog) pet;
Penguin png = (Penguin) pet;
使用强转时,可能出现ClassCastException的异常。为了避免在向下转型时CIassCastException的异常,我们在向下转型之前,先进行instanceof的判断,一旦返回true,就进行向下转型。如果返回false,不进行向下转型。
instanceof的使用
语法: 对象名 instanceof 类或接口
注意:
使用instanceof运算符时,对象的类型必须和instanceof的第二个参数所指定的类或接口在继承上有上下级关系,否则会出现编译错误。
instanceof通常和强制类型转换结合使用
例:
public class Master {
public void play(Pet pet){
if (pet instanceof Dog) { //如果传入的是狗狗
Dog dog = (Dog) pet;
dog.catchingFlyDisc();
}else if (pet instanceof Penguin) { //如果传入的是企鹅
Penguin pgn = (Penguin) pet;
pgn.swimming();
}
}
}