1. 程式人生 > >8.JAVA-向上轉型、向下轉型

8.JAVA-向上轉型、向下轉型

span 需要 打印 java back http 向上 實例 style

父子對象之間的轉換分為了向上轉型向下轉型,它們區別如下:

  • 向上轉型 : 通過子類對象(小範圍)實例化父類對象(大範圍),這種屬於自動轉換
  • 向下轉型 : 通過父類對象(大範圍)實例化子類對象(小範圍),這種屬於強制轉換

1. 向上轉型

示例1-向上轉型

class A {
         public void print() {
                  System.out.println("A:print");
         }
}

class B extends A {
         public void print() {        
                  System.out.println(
"B:print"); } } public class Test{ public static void main(String args[]) { A a = new B(); //通過子類去實例化父類 a.print(); } }

運行打印:

技術分享圖片

如上圖所示,可以看到打印的是class B的print,這是因為我們通過子類B去實例化的,所以父類A的print方法已經被子類B的print方法覆蓋了.從而打印classB的print.

這樣做的意義在於:

  • 當我們需要多個同父的對象調用某個方法時,通過向上轉換後,則可以確定參數的統一.方便程序設計(參考下面示例)

示例2-向上轉型的作用分析

class A {
         public void print() {
                  System.out.println("A:print");
         }
}

class B extends A {
         public void print() {        
                  System.out.println(
"B:print"); } } class C extends B { public void print() { System.out.println("C:print"); } } public class Test{ public static void func(A a) { a.print(); } public static void main(String args[]) { func(new B()); //等價於 A a =new B(); func(new C()); //等價於 C c =new C(); } }

運行打印:

技術分享圖片

PS:向上轉型時,父類只能調用父類方法或者子類覆寫後的方法,而子類中的單獨方法則是無法調用的.

2. 向下轉型

在java中,向下轉型則是為了,通過父類強制轉換為子類,從而來調用子類獨有的方法(向下轉型,在工程中很少用到).

為了保證向下轉型的順利完成,在java中提供了一個關鍵字:instanceof,通過instanceof可以判斷某對象是否是某類的實例,如果是則返回true,否則為false,instanceof使用如下:

A a = new B();                 //向上轉型 (B類是A的子類)

a instanceof A;                //返回true.
a instanceof B;                //返回true
a instanceof C;                //返回false

接下來,我們便來分析向下轉型的意義.

示例-向下轉型的作用分析

class A {
         public void print() {
                  System.out.println("A:print");
         }
}

class B extends A {
         public void print() {        
                  System.out.println("B:print");
         }
         public void funcB(){
                  System.out.println("funcB");
         }
}

class C extends A {
         public void print() {        
                  System.out.println("C:print");
         }
         public void funcC(){
                  System.out.println("funcC");
         }
}

public class Test{
         public static void func(A a)
         {
                  a.print();
                  if(a instanceof B)
                  {
                          B b = (B)a;   //向下轉型,通過父類實例化子類
                          b.funcB();    //調用B類獨有的方法
                  }
                  else if(a instanceof C)
                  {
                          C c = (C)a;  //向下轉型,通過父類實例化子類
                          c.funcC();   //調用C類獨有的方法
                  }
         }

         public static void main(String args[])
         {
                  func(new A());   
                  func(new B());
                  func(new C());
         }
}

運行打印:

技術分享圖片

從上面打印可以看到,我們成功通過向下轉型來調用B類和C類獨有的方法.

8.JAVA-向上轉型、向下轉型