父類和子類轉換淺談篇(將子類對象賦值給父類對象)

來源:互聯網
上載者:User
最近對將子類對象賦值給父類對象有點心得,想和大家分享一下.但本人水平有限,請各位指正和批評.
言歸正傳,下面是幾個小例子,請大家看一看.
 
測試一 
 父類:
public  class Sup class 
{
     public  void print()
    {
       System.out.println("this is 父類print()方法"+"——此時對象"+ this.toString());
    }
}

子類:
public class Subclass extends Supclass 
{
    public static void main(String[] args) 
    {
       Supclass sup=new Subclass();
       sup.print();
       System.out.println("此時對象"+sup.toString());
    }
}

  結果:this is 父類print()方法——此時對象是Subclass@126b249
        此時對象是Subclass@126b249
  說明: 
   Supclass sup=new Subclass();
   雖然聲明的對象是父類對象,但實際的記憶體空間是子類對象的。
   繼承父類的方法public void print()被調用,輸出的是子類對象名字解析。

結論:編譯時間聲明的對象是父類對象,但運行時卻是子類對象.子類沒有重寫父類的方法,則此  時的對象調用繼承父類的方法。

測試二
  父類:
public class Supclass 
{
    public void print()
    {
       System.out.println("this is 父類print()方法"+"——此時對象"+this.toString());
    }
}

  子類:
public class Subclass extends Supclass 
{
        public void print()
    {
       System.out.println("this is 子類print()方法"+"——此時對象"+this.toString());
    }
    public static void main(String[] args) 
    {
       Supclass sup=new Subclass();
       sup.print();
       System.out.println("此時對象"+sup.toString());
    }
}

   結果:this is 子類print()方法——此時對象是Subclass@126b249
         此時對象是Subclass@126b249
   說明:
   我在上個例子的基礎上,重寫了父類的print()方法,此時的調用的是子類的print()方法。

結論:在上個例子結論的基礎上,我得到了一個結論:此時對象運行時確實子類對象,如果子類沒有從寫父類的方法,
      則此時的對象調用繼承父類的方法;否則,此時的對象調用子類方法.

問題: 我們是不是可以從上面的測試得到的這樣結論: 將子類對象賦值給父類對象(即Supclass sup=new Subclass()),
       我們得到的就是子類對象,即sup就是子類對象??????
測試三
  父類:
 public class Supclass 
{
        protected String className="父類屬性";
    public void print()
    {
       System.out.println("this is 父類print()方法"+"——此時對象"+this.toString());
    }
}

  子類:
public class Subclass extends Supclass 
{       
        protected String className="子類屬性";
        public void print()
    {
       System.out.println("this is 子類print()方法"+"——此時對象"+this.toString());
    }
    public static void main(String[] args) 
    {
       Supclass sup=new Subclass();
       System.out.println("此時的屬性時:"+sup.className);
    }

  結果:此時的屬性時:父類屬性

  說明:我在第一個測試的基礎上,給父類添了一個屬性className,在子類重寫了這個屬性.
        但我輸出此時對象的屬性時,卻是父類的屬性.
  結論: 將子類對象賦值給父類對象,方法和屬性和我們正統的繼承關係很不一樣.
  問題:
       此時對象究竟是子類對象,還是父類對象?

  開始推測:  
      我在推測之前有幾點須聲明:
      1.當我們new一個子類對象時,父類對象的建構函式同時也被執行,即父類的一些必要資訊和子類對象共佔一個記憶體空間,
        當我們方法重寫時,於是我們就能使用super這個指代父類的對象.

      2.java中對象並不是完全的物件導向思想做的,即不是把一個對象的屬性和方法同時封裝到對象中.
        而是對象有自己的屬性,方法卻是引用類中的方法,可以說它是把屬性和類中方法的引用封裝到對象中.
        於是對象調用的方法不是自己的方法,而是類中方法.至於java為什麼要這樣做,我就不知道了.

      3.當對象被載入到記憶體時,類先被載入到記憶體中,此後類應是一隻留在記憶體中.至於類什麼時候從記憶體中消失,我也不知道.
         我想java一定有自己的回收機制,就像回收對象一樣.

      4.編譯和與運行是完全不同的事.編譯時間主要做的是聲明對象的類型,分配屬性,檢查語法錯誤等
        運行時做的是,將對象載入記憶體(一般用new,反射也常用), 運行代碼執行功能等.
      
      5.若是讀者您和我在這幾點沒有產生共鳴的話,或者說我們在這幾點沒用相同的認識的話,你會覺得我在胡說.
        也許你會覺得我的專家分太低,就覺得我的可信程度就低.但我想說的是學不分先後,達者為先.
        呵呵,我已準備好將我的專家分變為負值了,不胡扯了,我們繼續.

     推測:
       1.當我們編譯Supclass sup=new Subclass()時,sup對象被聲明為Supclass類,於是sup對象的屬性便是父類對象的屬性的值,
         它是編譯時間被確定好的.(聲明4,可以對這段進行解釋).這段話可以對測試三進行解釋,即為什麼此時對象的屬性是父類對象的屬性. 
 
       2.當我們運行Supclass sup=new Subclass()時,此時sup對象的記憶體空間是子類對象的記憶體空間(聲明4,可以對這段進行解釋),
         注意此時sup對象的記憶體空間由兩部分組成父類的一些必要資訊和子類對象資訊(聲明1,可以對這段進行解釋).
         當我們不重寫父類的方法時,由於此時記憶體空間已有父類的一些必要資訊,所以繼承父類的方法public void print()當然能被調用。
         這段話可以對測試一進行解釋.

       3.接著2繼續,若我們重寫父類的方法時,由於sup對象的記憶體空間是子類對象的記憶體空間,子類的方法public void print()已被載入到記憶體中.
         所以我們調用的是子類的方法public void print();如果你需要調用父類的被重寫方法,需要用super.
         這段話可以對測試二進行解釋.
     總結:
         以下純是個人觀點: 
         將子類對象賦值給父類對象,所得到對象是這樣的一個對象:
         它是一個編譯是為父類對象,但運行卻是一個子類對象,具體特徵如下.
         1.被聲明為父類對象
         2.擁有父類屬性
         3.佔用子類的記憶體空間
         4.子類方法覆蓋父類的方法時,此時對象調用的是子類的方法;否則,自動調用繼承父類的方法.
         5.我人認為這個對象既不是父類對象,也不是子類對象.當我們用到它的方法時,
           我便把它看成子類對象;若用到它的屬性時,我把它看成父類對象.
           它是一個佔用父類屬性,而使用子類方法的對象.至於到底是什麼對象,我認為還是得根據聲明來,它應算是父類對象,但擁有子類方法.
      
     想一想:
          在測試三的基礎上,我們如何取出子類的屬性?????

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.