java中的向上转型与向下转型
Posted 阿苍老师
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java中的向上转型与向下转型相关的知识,希望对你有一定的参考价值。
以前学Javase时就专门注意过这个问题,现在到了现在又犯了这个错误,这个错误让我排查了好久
1 : 向上转型:大体可以理解为子类转换成父类,例子优先还是:
1 public class Animal { 2 public void eat(){ 3 System.out.println("animal eatting..."); 4 } 5 } 7 public class Cat extends Animal{ 9 public void eat(){ 11 System.out.println("我吃鱼"); 12 } 13 } 15 public class Dog extends Animal{ 17 public void eat(){ 19 System.out.println("我吃骨头"); 20 } 22 public void run(){ 23 System.out.println("我会跑"); 24 } 25 } 27 public class Main { 29 public static void main(String[] args) { 31 Animal animal = new Cat(); //向上转型 32 animal.eat(); 34 animal = new Dog(); 35 animal.eat(); 36 } 38 } 39 40 //结果: 41 //我吃鱼 42 //我吃骨头
(1):虽然将子类转换成父类,但调用方法是调用的是子类的方法,这里的转型只是父类的引用指向了子类的实例。
(2):如果子类还有父类中没有的方法 w 可以调用吗 ?答案当然是不能,子类转换成父类,子类多余的方法会丢失,就像例子中dog的run()方法会丢失
(3)为什么要用向上转型:父类是接口啊!接口的好处就不用说了,比如当你对所有动物全部放生,就不用一个个放生,可以 Save(Animal);就OK
2:向下转型:简单来说就是将父类转换为子类,但是转换可就不像向上转那末好转了!理解起来也比向上转型不好理解
(1):首先注意:向下转型的前提是父类对象指向的是子类对象,就是你必须先向上转然后才能向下转,可能会有人说转上去再转下来,没有意义啊!作用就是当再次转下来的时候,就可以调用向上转丢失的方法,而且编程以后接口一多会有很多泛型编程,这样就可以针对父类进行编程,如果需要再取用子类的方法。
(2):强制类型转换:将一个子类的引用赋值给超类,编译器是允许的,但将一个超类引用赋给一个子类变量必须进行强制类型转换,
public class Sys{ public static void main(String[] args) { Animal a=new Dog(); //向上转型 a.eat(); Dog aa=(Dog)a; //向下转型,编译和运行皆不会出错(正确的) aa.eat();//向下转型时调用的是子类的 aa.run(); Animal a2=new Animal(); Dog aa2=(Dog) a2; //-不安全的---向下转型,编译无错但会运行会出错 aa2.eat(); aa2.run(); } } //结果为: //我吃骨头 //我吃骨头 //我会跑 //报错······
结果表明:只有先经过向上转型的才能进行向下转型,向下转型必须要进行强制类型转换,
(3):另外要注意两点,
第一:如果Cat向上转成Animal,那末向下转Animal只能转成Cat,不能转成Dog,因为Cat怎么也不会变成Dog
第二:为了安全的类型转换,向下转型时最好先 if ( Dog instanceof Animal) 判断一下,否则一旦无法转换,程序就会直接终止
以上是关于java中的向上转型与向下转型的主要内容,如果未能解决你的问题,请参考以下文章