这篇文章主要介绍了Java向上转型和向下转型实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
学习向上转型和向下转型怎么用没多难,但是为什么那样用,我搞了很多次没弄明白。没弄明白的原因是平时学习时之看例子,而例子一般都比较简单,没有对象之间的调用,一般就是一个对象调用自己的方法。
首先看下怎么用转型。
要转型,首先要有继承。继承是面向对象语言中一个代码复用的机制,简单说就是子类继承了父类中的非私有属性和可以继承的方法,然后子类可以继续扩展自己的属性及方法。
向上转型:子类对象转为父类,父类可以是接口。公式:父亲f=新儿子();父亲是父类或接口,儿子是子类。
向下转型:父类对象转为子类。公式:儿子s=f(儿子);
例子:向上转型
包多态; 公共类人类{ 公共空间的睡眠(){ system . out。println(“人类睡眠…”); } 公共静态void main (String [] args) { 人类h=new男();//向上转型 h.sleep (); 男性m=新男性();//干嘛要向上转型 m.sleep ();//h.speak();此方法不能编译,报错说人类类没有此方法 } } 类男性延伸人类{ @Override 公共空间的睡眠(){ system . out。println(“男性睡眠…”); } 公共空间说话(){ system . out。println(“我是男”); } } 类女性延伸人类{ @Override 公共空间的睡眠(){ system . out。println(“女性睡眠. . "); } 公共空间说话(){ system . out。println(“我女”); } }
注意:向上转型不要强制转型。向上转型后父类的引用所指向的属性是父类的属性,如果子类重写了父类的方法,那么父类引用指向的或者调用的方法是子类的方法,这个叫动态绑定。向上转型后父类引用不能调用子类自己的方法,就是父类没有但是子类的方法,如果调用不能编译通过,比如子类的说话方法。
非要调用子类的属性呢?如果不向下转型就需要给需要的属性写getter方法。
例子:
包多态; 公共类人类{ 字符串名称=叭恕? 公共字符串getName () { 返回this.name; } 公共空间的睡眠(){ system . out。println(“人类睡眠…”); } 公共静态void main (String [] args) { 人类h=new男();//向上转型 System.out.println (h.getName ()); } } 类男性延伸人类{ 字符串名称=澳行浴? 公共字符串getName () { 返回this.name; } @Override 公共空间的睡眠(){ system . out。println(“男性睡眠…”); } 公共空间说话(){ system . out。println(“我是男”); } } 类女性延伸人类{ 字符串名称=芭浴? 公共字符串getName () { 返回this.name; } @Override 公共空间的睡眠(){ system . out。println(“女性睡眠. . "); } 公共空间说话(){ system . out。println(“我女”); } }
非要调用子类扩展的方法,比如说话方法,就只能向下转型了。
例子:向下转型
向下转型需要考虑安全性,如果父类引用的对象是父类本身,那么在向下转型的过程中是不安全的,编译不会出错,但是运行时会出现java.lang.ClassCastException错误。它可以使用instanceof来避免出错此类错误即能否向下转型,只有先经过向上转型的对象才能继续向下转型。
包多态; 公共类人类{ 公共空间的睡眠(){ system . out。println(“人类睡眠…”); } 公共静态void main (String [] args) { 人类h=new男();//向上转型 人类h2=new ();//h.speak();此时需要向下转型,否则不能调用说话的方法。 男性h m=(男性); m.speak ();/* *男m1=h2(男性); m1.speak ();此时会出现运行时错误,所以可以用instanceOF判断*/如果(h2 instanceof男性){ 男性m1=h2(男性); m1.speak (); } } } 类男性延伸人类{ @Override 公共空间的睡眠(){ system . out。println(“男性睡眠…”); } 公共空间说话(){ system . out。println(“我是男”); } }Java向上转型和向下转型实例解析