Java对象的向上转型和向下转型问题

2019-11-20 08:56:00
六月
来源:
https://www.cnblogs.com/xiaoyezideboke/p/10939219.html
转贴 722

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对象向上转型和向下转型


版权声明:本文为博主原创文章,遵循  CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/baidu_26954625/article/details/90581757

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


发表评论
评论通过审核后显示。