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中的向上转型与向下转型的主要内容,如果未能解决你的问题,请参考以下文章

Java中的向上转型和向下转型

java向上转型和向下转型

JAVA向上转型和向下转型

Java SE之向上转型与向下转型

JAVA对象 向上转型upcasting,向下转型downcasting

java 向上转型与向下转型