Java 转型问题其实并不复杂,只要记住一句话: " 父类引用指向子类对象"。
什么叫父类引用指向子类对象?
从 2 个名词开始说起:向上转型(upcasting) 、向下转型(downcasting)。
举个例子:有2个类,Father 是父类,Son 类继承自 Father。
第 1 个例子:
Father f1 = new Son(); // 这就叫 upcasting (向上转型)
// 现在 f1 引用指向一个Son对象
Son s1 = (Son)f1; // 这就叫 downcasting (向下转型)
// 现在f1 还是指向 Son对象
第 2 个例子:
Father f2 = new Father();Son s2 = (Son)f2; // 出错,子类引用不能指向父类对象
你或许会问,第1个例子中:Son s1 = (Son)f1; 问为什么是正确的呢。
很简单因为 f1 指向一个子类对象,Father f1 = new Son(); 子类 s1 引用当然可以指向子类对象了。
而 f2 被传给了一个 Father 对象,Father f2 = new Father(); 子类 s2 引用不能指向父类对象。
总结:
1、父类引用指向子类对象,而子类引用不能指向父类对象。
2、把子类对象直接赋给父类引用叫upcasting向上转型,向上转型不用强制转换吗,如:
Father f1 = new Son();
3、把指向子类对象的父类引用赋给子类引用叫向下转型(downcasting),要强制转换,如:
f1 就是一个指向子类对象的父类引用。把f1赋给子类引用 s1 即 Son s1 = (Son)f1;
其中 f1 前面的(Son)必须加上,进行强制转换。
向上转型:
要 记住向上转型时父类的引用会遗失除与父类共有的其他方法。
向上转型时,父类指向子类引用对象会遗失除与父类对象共有的其他方法,也就是 在转型过程中,子类的 新有的方法都会遗失掉,( upcasting 会丢失子类特有的方法,但是子类overriding 父类的方法,子类方法有效)在编译时,系统会提供找不到方法的错误。
向下转型:
向下转型过程中要注意的是:
情况一:如果父类引用的对象如果引用的是指向的子类对象,那么在向下转型的过程中是安全的。也就是编译是不会出错误的。
Father father = new Son();
Son son = (Son)father; // 父类引用的对象是指向子类的对象,向下转换时需要强制类型转换,编译不会出错
情况二:如果父类引用的对象是父类本身,那么在向下转型的过程中是不安全的,编译不会出错,但是运行时会出现java.lang.ClassCastException错误。它可以使用instanceof来避免出错此类错误。
Father father = new Father(); Son son = (Son)father; //对象向下转型,编译不会报错,运行时报java.lang.ClassCateException错误
1、 父类引用可以指向子类对象,子类引用不能指向父类对象。
2、把子类对象[new Son()]直接赋给父类引用[Father father]叫upcasting向上转型, 向上转型不用强制转型。
如Father father = new Son();
3、把指向子类对象的父类引用[father]赋给子类引用[son]叫向下转型(downcasting),要强制转型。
如father就是一个指向子类对象的父类引用,把father赋给子类引用son 即Son son =(Son)father;
其中father前面的(Son)必须添加,进行强制转换。
4、 upcasting 会丢失子类特有的方法,但是子类overriding 父类的方法,子类方法有效
5、向上转型的作用, 减少重复代码,父类为参数,调有时用子类作为参数,就是利用了向上转型。这样使代码变得简洁。体现了JAVA的抽象编程思想。
【引申到之前我们涉及到类型的转换问题:自动类型转换,强制类型转换】
参考: https://www.cnblogs.com/cxyzyh2017/p/7215430.html
Java对象向上转型和向下转型
1、对象向上转型
定义
子类引用的对象转换为父类类型称为向上转型,通俗的说就是是将子类对象转换为父类对象,此处父类对象可以是接口。
指向子类的父类引用由于向上转型了,它只能访问父类中拥有的方法和属性,而对于子类中存在而父类中不存在的方法,该引用时不能使用的,尽管是重载该方法。若
子类重写了父类中的某些方法,在
调用该方法的时候,必定是使用子类中定义的这些方法(动态链接,动态调用)
解释
比如我有两个类,一个父类Animal,另一个子类Bird
Animal b = new bird();
2、对象向下转型
定义
父类引用的对象转换为子类类型成为向下转型
所以向下转型过程中要注意的是:
情况一:如果父类引用的对象如果引用的是指向的子类对象,那么在向下转型的过程中是安全的,也就是编译是不会出错误的。
情况二:如果父类引用的对象是父类本身,那么在向下转型的过程中是不安全的,编译不会出错,但是运行时会出现java.lang.classcastException的错误,她可以使用instanceof来避免出此类错误
解释
比如我有两个类,一个父类Animal,另一个子类Bird
Animal a = new Animal();
Birds b= (Bird)a; //强制类型转换
注意:
这里编译没有问题,运行时会报java.lang.ClassCastException错
3.隐式转型
如int可以自动在计算和赋值时转型成为long,float可以自动的转型成为double,我们并不需要去关心,但是如果从高精度转到低精度就会丢失数据,所以无法隐式转型
比如下面的转型栗子
因为1是int型变量,精度比short类型要高,因此不能隐式的将int转为short
short a = 1;//并不能这么干
但是使用+=,++运算可以隐式转换
a+=1;
因为上面的语句相当于
a=(short)(a+1);
4.总结
1.父类引用可以指向子类对象,子类引用不能指向父类对象。
2.把子类对象直接赋给父类引用叫upcasting向上转型,向上转型不用强制转型
3.把指向子类对象的父类引用赋给子类引用叫向下转型downcasting,要强制转型
4.upcasting会丢失子类特有的方法,但是子类overriding父类的方法,子类方法是有效的
5.向上转型作用:
减少重复代码,父类作为参数,调用时用子类作为参数,就是利用了向上转型,可以使得代码更简洁
参考:
https://blog.csdn.net/baidu_26954625/article/details/90581757