Java向上转型和向下转型实例解析

  

这篇文章主要介绍了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向上转型和向下转型实例解析