多态中有一种“向上转型”和“向下转型”的用法,记录一下
class Animal{
public void shout() {
System.out.println("动物叫");
}
public void eat(){
System.out.println("动物吃");
}
}
class Dog extends Animal{
@Override
public void shout() {
System.out.println("狗叫");
}
public void home() {
System.out.println("狗看门");
}
}
class Cat extends Animal{
@Override
public void shout() {
System.out.println("猫叫");
}
public void sleep() {
System.out.println("猫趴窝");
}
}
public class AnimalInf{
//public static void shout(Animal an) {
// an.shout();
//}
public static void main(String[] args) {
Dog dog1 = new Dog();
Animal dog2 = new Dog();//向上转型后只会调用父类中方法
System.out.print("dog1.shout():");
dog2.shout();
System.out.print("dog2.shout():");
dog2.shout();//虽然转型成了Animal类,但是因为Dog类中重写了shout方法,所以是“狗叫”,这就叫《方法的调用看父类,运行结果看子类,重写的方法看子类》
System.out.print("dog1.home():");
dog1.home();
System.out.print("dog2.eat():");
dog2.eat();//调用了Animal类中的方法,
// dog2.home();//这里会报错,因为向上转型调用方法看左边,结果看重写,而Animal类中没有home方法
Dog dog3 = (Dog)dog2;//向下转型后,dog2才成为了一个Dog类的对象
System.out.print("dog3.shout():");
dog3.shout();
System.out.print("dog3.home():");
dog3.home();
System.out.print("dog3.eat():");
dog3.eat();
//用instaceof测试一个对象是否为一个类的实例
Animal cat1 = new Cat();
System.out.println(dog1 instanceof Dog);//true
System.out.println(dog2 instanceof Animal);//true
System.out.println(cat1 instanceof Dog);//false
System.out.println(cat1 instanceof Cat);//true,因为cat1是Cat的间接子类
System.out.println(cat1 instanceof Animal);//true
/*
会报错ClassCastException的异常,因为不能由子类(Dog)推出父类(Animal)中的细节,多态因该是由上到下的"抽象模糊形态"
Dog dog = (Dog) new Animal();
dog.eat();
*/
}
}
总结:向上转型和向下转型还是Java多态中比较重要的一个知识点!