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 的用法,我寫東西比較喜歡擴展。
                                                  一家之言,歡迎排磚。 
                                                  爲了能寫出更好的簡單易懂內容豐富的內容, 歡迎大家不吝賜教 。感謝!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章