Java 向上转型和向下转型的详解
转型是在继承的基础上而言的,继承是面向对象语言中,代码复用的一种机制,通过继承,子类可以复用父类的功能,如果父类不能满足当前子类的需求,则子类可以重写父类中的方法来加以扩展。
向上转型:子类引用的对象转换为父类类型称为向上转型。通俗地说就是是将子类对象转为父类对象。此处父类对象可以是接口
向下转型:父类引用的对象转换为子类类型称为向下转型。
前者是一个向上转型,Animal dog 引用指向new Dog();子类对象当成父类对象,只能调用父类的成员,如果子类重写了父类的方法就根据这个引用指向调用子类重写的这个方法(这个方法就是覆盖override)。这个调用过程就称为“动态绑定”。
转型需要注意的问题:
向上转型时,父类指向子类引用对象会遗失除与父类对象共有的其他方法,也就是在转型过程中,子类的新有的方法都会遗失掉,在编译时,系统会提供找不到方法的错误。
实例如下:
public class Animal { public void eat(){ System.out.println("animal eatting..."); } } class Bird extends Animal{ public void eat(){ System.out.println("bird eatting..."); } public void fly(){ System.out.println("bird flying..."); } } class Main{ public static void main(String[] args) { Animal b=new Bird(); //向上转型 b.eat(); b.fly(); //此处提示在Animal中没有定义fly方法。 }
在向下转型过程中,分为两种情况:
情况一:如果父类引用的对象如果引用的是指向的子类对象,那么在向下转型的过程中是安全的。也就是编译是不会出错误的。
情况二:如果父类引用的对象是父类本身,那么在向下转型的过程中是不安全的,编译不会出错,但是运行时会出现java.lang.ClassCastException错误。它可以使用instanceof来避免出错此类错误。
实例如下:
public class Girl { public void smile(){ System.out.println("girl smile()..."); } } class MMGirl extends Girl{ @Override public void smile() { System.out.println("MMirl smile sounds sweet..."); } public void c(){ System.out.println("MMirl c()..."); } } class main{ public static void main(String[] args) { Girl g1=new MMGirl(); //向上转型 g1.smile(); MMGirl mmg=(MMGirl)g1; //向下转型,编译和运行皆不会出错 mmg.smile(); mmg.c(); Girl g2=new Girl(); //MMGirl mmg1=(MMGirl)g2; //不安全的向下转型,编译无错但会运行会出错 //mmg1.smile(); //mmg1.c(); if(g2 instanceof MMGirl){ MMGirl mmg1=(MMGirl)g2; mmg1.smile(); mmg1.c(); } }
总结:
1、父类引用可以指向子类对象,子类引用不能指向父类对象。
2、把子类对象直接赋给父类引用叫upcasting向上转型,向上转型不用强制转型。
如Father father = new Son();
3、把指向子类对象的父类引用赋给子类引用叫向下转型(downcasting),要强制转型。
如father就是一个指向子类对象的父类引用,把father赋给子类引用son 即Son son =(Son)father;
其中father前面的(Son)必须添加,进行强制转换。
4、upcasting 会丢失子类特有的方法,但是子类overriding 父类的方法,子类方法有效
5、向上转型的作用,减少重复代码,父类为参数,调有时用子类作为参数,就是利用了向上转型。这样使代码变得简洁。体现了JAVA的抽象编程思想。
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
本文向大家介绍Java 转型(向上或向下转型)详解及简单实例,包括了Java 转型(向上或向下转型)详解及简单实例的使用技巧和注意事项,需要的朋友参考一下 在Java编程中经常碰到类型转换,对象类型转换主要包括向上转型和向下转型。 向上转型 我们在现实中常常这样说:这个人会唱歌。在这里,我们并不关心这个人是黑人还是白人,是成人还是小孩,也就是说我们更倾向于使用抽象概念“人”。再例如,麻雀是鸟类的一
主要内容:将派生类对象赋值给基类对象,将派生类指针赋值给基类指针,将派生类引用赋值给基类引用在 C/ C++ 中经常会发生数据类型的转换,例如将 int 类型的数据赋值给 float 类型的变量时,编译器会先把 int 类型的数据转换为 float 类型再赋值;反过来,float 类型的数据在经过类型转换后也可以赋值给 int 类型的变量。 数据类型转换的前提是,编译器知道如何对数据进行取舍。例如: 输出结果为 10,编译器会将小数部分直接丢掉(不是四舍五入)。再如: 输出结果为 10.
本文向大家介绍浅谈Java向下转型的意义,包括了浅谈Java向下转型的意义的使用技巧和注意事项,需要的朋友参考一下 一开始学习 Java 时不重视向下转型。一直搞不清楚向下转型的意义和用途,不清楚其实就是不会,那开发的过程肯定也想不到用向下转型。 其实向上转型和向下转型都是很重要的,可能我们平时见向上转型多一点,向上转型也比较好理解。 但是向下转型,会不会觉得很傻,我是要用子类实例对象,先是生成子
这段代码是直接从文章中复制下来的 但是会报 运行时 dynamic_cast 的操作数必须包含多态类类型的错误,运行时也会报错 我的理解是这段代码在进行向下转型,应该是没有问题的。
版本: Matlab 2009a 我正在生成一个大小向量 现在,Matlab将返回的元素向量[240,63,0]改为[-1,1],大小为 PS:我想从大小矩阵上的所有trhe值中减去或加上'1'
问题内容: 关于类变量,向上转换和向下转换之间有什么区别? 例如,在下面的程序类中,动物仅包含一个方法,而Dog类包含两个方法,然后将Dog变量强制转换为Animal变量。 如果转换完成,那么我们如何使用Animal变量调用Dog的另一个方法。 问题答案: 向下转换将转换为超类型,而向下转换将转换为子类型。始终允许进行向上转换,但是向下转换涉及类型检查,并且可能引发。 在你的情况下,从a 到的转换