首先我们声明一个Animal类,它是父类。 声明一个Dog类,是子类。在Dog类里,main方法进行测试。
package PrimaryTest;
public class Animal {
float weight ;
int height ;
public void run(){
System.out.println("I am an animal,i can run");
}
public void cry(){
System.out.println("i am an animal ,i can cry");
}
}
以下为上转型测试:
package PrimaryTest;
public class Dog extends Animal{
public void run(){ //子类重写了run方法
System.out.println("i am a god , i can run , different from others ");
}
public void bark(){ //子类特有的bark方法
System.out.println("i am dog ,i can bark , wang wang wang !");
}
public static void main(String[] args) {
//上转型 父类的引用指向子类对象,子类对象被当成了父类对象看待 ,子类会失去它自己特有的方法。
Animal animal = new Dog();
//animal.bark 已经是错误的,这个方法已经不能使用了。此时的new dog 狗对象已经上转型成了animal对象,失去了它的bark方法。
animal.cry(); //这个方法还能正常使用
System.out.println("------------------------");
//如果是子类对象经过上转型后成为父类对象,那么它还可以进行下转型再次转换回子类对象
Dog dog = (Dog) animal;
dog.bark();
}
}
运行main方法结果如下:
i am an animal ,i can cry
------------------------
i am dog ,i can bark , wang wang wang ! (上转型之后又下转型成功了,还能执行狗的bark方法!)
以下测试下转型测试(没有任何前提,子类的引用直接指向父类的对象):
//下转型 子类的引用指向父类的对象,父类的对象被当成了子类看待,需要加强制转换!
//以下的代码,编译时候没报错,一运行就会报异常
Dog dog2 = (Dog) new Animal(); //异常为:Exception in thread "main" java.lang.ClassCastException: PrimaryTest.Animal cannot be cast to PrimaryTest.Dog //很容易理解,我们可以说狗是一种动物,但不能说动物是狗。
所以我们在直接向下转型时候,往往用if判断它们之间是否有关系(XXX instanceof XXX), 下面代码,在增加了判断之后,发现不报异常了。证明就不能这样直接下转型。
if (new Animal() instanceof Dog){
Dog dog2 = (Dog) new Animal();
dog2.bark();
}
结果是什么都没有程序就结束了。严格来说,java是不支持这种直接下转型的!