天天看點

java中的類的向上轉型向下轉型問題

    廢話不多說,先寫一個例子友善後面的唠叨.

向上!!!!

class A{
   int n  ;
   void tell(){
      System.out.println("B類中的tell()-->n="+n);
   }
   void tell1(){
      System.out.println()
   }
   void sayA(){
      System.out.println("Hello,我是A類中的方法sayA()")
   }
}
class B extends A{
   double n ;
   void tell(){
      System.out.prinln("B類中的tell()-->n="+n);
   }
   void sayB(){
      System.out.println("Hello,我是B類中的方法sayB()")
   }
}
public class Demo{
  puclic static void main(Sring args[]){
       A a = new B() ;
       a.n = 1
       a.tell() ;
  }
}
           

在上面的例子裡面定義了兩個類,一個父子A  一個子類B

     在這裡大家比較迷茫包括我剛開始學的時候不明白a這個執行個體化之後裡面是什麼東西.

      首先寫出我自己的記憶方式:     向上轉了之後,也就是A的執行個體了,也就是裡面的東西自然就是A的東西了.

      大家會認為我上面剛才說的是廢話: 

                      正解:  a裡面的東西包含的事A裡面的東西.用代碼表示就是

class A{
   int n  ;
   void tell(){
      System.out.println("B類中的tell()-->n="+n);
   }
   void sayA(){
      System.out.println("Hello,我是A類中的方法sayA()")
   }
}
           

在代碼中大家看了,其中a保留了A中的原有屬性A,原來的方法sayA(),丢掉了B中的B中的sayB(),同時裡面的tell方法保留的是重寫之後的方法。通過自己運作之後的發現出現的n竟然等于0.0  不是1。

  對這個是1不是0的解釋:  a.n調用的是類A中的n,但是在實際的a.tell()中使用的是B中的tell() ;

用我們老師對向上轉型的解釋 就是:

          繼承之後的B類中有double型的n,複寫之後的方法tell(), 繼承來的tell1(),tellA()   還有自己的sysB() .

          轉型之後的a擁有的就是上面代碼中的東西了。

  上面解釋之中我有一些基礎的東西隐藏了, 讀者自行了解。

向下!!!

    這裡面會結合我自己自學時候的一些知識。

    先來一個例子。

int x = 2 ;
float a = (float)x;
x++ ;
           

這時候x出來的結果是3 不是3.0

至于為什麼讀者自己了解。 

同樣的在向下的時候也就是這樣的。看個代碼

class A{
   int n  ;
   void tell(){
      System.out.println("B類中的tell()-->n="+n);
   }
   void tell1(){
      System.out.println()
   }
   void sayA(){
      System.out.println("Hello,我是A類中的方法sayA()")
   }
}
class B extends A{
   double n ;
   void tell(){
      System.out.prinln("B類中的tell()-->n="+n);
   }
   void sayB(){
      System.out.println("Hello,我是B類中的方法sayB()")
   }
}
public class Demo{
  puclic static void main(Sring args[]){
       A a = new B() ;
       a.n = 1
       a.tell() ;
       B b = new B();
       b = (B)a ;
       b.tell() ;
  }
}
           

上面的例子之中a還是第一個例子之中的a沒有任何的變化。

b就是一個典型的B類了。這個時候可以認為和A類沒有任何的關系了。

在擴充一點知識:向下不能随便的向下轉的。隻能向自己的子孫轉。上面的例子中因為開始有了向上轉了(因為有繼承,是以可以向上轉) 在這個基礎之上就可以向下轉了。如果沒有這個過程的話,不能随便的鄉下轉型的。這時候一般會用到instantceof關鍵字來确定兩者之間有老子和兒子的關系。。  

                                                   第一次這個用心的寫東西。寫的有點抽象,不過我可以斷定,如果你看懂了話。你不僅僅會學到轉型的東西  還會知道隐藏  instantce0f 的用法,我寫東西比較喜歡擴充。                                                   一家之言,歡迎排磚。                                                     為了能寫出更好的簡單易懂内容豐富的内容, 歡迎大家不吝賜教 。感謝!