在我们的日常中,上转型和下转型都使用的比较少,所以当别人问起来什么是上转型,什么是下转型,自己往往一片模糊,或者不能将他们进行明显的区分。
在这里,我将以我个人理解来论述上下转型,希望对大家有帮助,如有不足,请指出,我会将此及时纠正。
首先概念:
- 向上转型
是指将基类(也叫父类)引用转换为导出类(也叫子类)引用的动作
问题
在向上转型的过程中,我们容易出现方法丢失的问题,比如我们将一个导出类(子类)进行向上转型,但是在基类(父类)中可能缺少部分导出类(子类)的方法,所以我们对导出类(子类)进行向上转型之后,使用基类(父类)对象去调用方法,只能调用基类(父类)有的方法。
- 向下转型
这个就和向上转型相对应,但是有一点,向下转型必须是在已经向上转型的基础上进行
计算
在这里,如何理解向下转型呢?它就如同一个数学问题,我将用短代码呈现:
//假设A为基类,也就是父类,B为导出类,也就是子类
A a;
a=new B();//这是进行上转型
B b=(B)a;//这是进行下转型
在这里面就相当于对a加了两个负号,然后负负得正,所以最后进行下转型后,对象b能够调用B类的所有方法,类似于"B b=new B()"。
在最后,我们上转型也好,下转型也罢,其实实际输出都是输出导出类(子类)的内容,不同的是,调用的对象不同,还有就是上转型的对象对造成方法丢失的情况。
以下是测试代码:
class Animal{
public void show(){
System.out.println("这是基类,也叫子类!");
}
public void walk(){
System.out.println("走或飞");
}
}
class Dog extends Animal{
public void show(){
System.out.println("这是导出类,也叫子类!");
}
public void walk(){
System.out.println("四只脚走!");
}
public void smile(){
System.out.println("dog smile!");
}
}
public class Test {
private static Object Dog;
public static void main(String[] args){
Animal animal=new Animal();
Dog dog=new Dog();
animal.show();
dog.show();
animal.walk();
dog.walk();
dog.smile();
//这是将animal进行上转型
animal=new Dog();
//调用时写的虽然是基类(父类)方法,但是输出的是导出类(子类)重写后的值
//对于我个人方便理解,我将它记为用基类(父类)调用导出类(子类)的方法
animal.show();
animal.walk();
//((Dog) animal).smile();
//下面进行下转型,下转型只能对经过上转型的对象进行下转型
Dog dog_0=(Dog)animal;
dog_0.walk();
dog_0.show();
dog_0.smile();
}
}
输出结果如下所示:
这是基类,也叫子类!
这是导出类,也叫子类!
走或飞
四只脚走!
dog smile!
这是导出类,也叫子类!
四只脚走!
四只脚走!
这是导出类,也叫子类!
dog smile!
其类图如下所示:
在测试过程中,我为了大家观看方便,将所有类写在一起,但是在实际生活中,最好是每个类分开写,这样也方便自己的一个了解与维护。