2017-04-26 66 views
0

我正在學習繼承,並正在使用這個具有超類和子類的簡單程序,如下所示。我的問題不是特定於此計劃的;然而,這是我第一次看到這種情況發生的地方,所以我將它用作一個更一般的概念性問題的例子。

爲什麼簡單地實例化類運行構造函數並輸出內容?我以前的理解是實例化類只是創建對象,但它不會做任何事情。爲什麼實例化一個類輸出類的內容?

SuperClass1.java

public class SuperClass1 { 
      public SuperClass1(){   
       System.out.println("This is the superclass constructor."); 
      } 
     } 

SubClass2.java

public class SubClass2 extends SuperClass1 
{ 
    public SubClass2() 
    { 
     System.out.println("This is the subclass constructor."); 
    } 

} 

Main.java

public class Main { 

    public static void main(String[] args) 
    { 
     SubClass2 obj1 = new SubClass2(); // why should this print something? 
    } 
} 

輸出
這是超類的構造函數。
這是子類的構造函數。

+0

「實例化類」通常意味着*做某事*。就其本身而言,Java並不知道除了將每個字段設置爲0(或者null或false)外,其他任何操作都不知道。這在大部分時間是不夠的,所以當實例化類時,類必須實現*做某事*。在你的情況下,「實例化」恰好包含一個'println'。 – markspace

+0

因爲這就是它的工作原理。我建議閱讀Oracle Java教程,因爲所有基本的東西都在那裏解釋。 – Kayaman

回答

0

首先,實例化一個對象意味着調用(並執行)構造函數,就是這樣。

所以,這樣的:

SubClass2 newInstance = <createNewInstance>; 
newInstance.<init()>; 

既通過構造函數調用new SubClass2()在Java中完成的。 「構建」對象和「初始化」它的屬性之間沒有分離。另外,如果你沒有明確地調用超類的另一個構造函數,那麼當創建一個類的對象時,默認構造函數(沒有參數的構造函數)會自動被調用。因此,實例化子類的對象將調用超類構造函數(它將打印第一行),然後打印第二行本身。

更詳細的子類看起來是這樣的幕後:

public class SubClass2 extends SuperClass1 
{ 
    public SubClass2() 
    { 
     super(); // calls the superclass constructor 
     System.out.println("This is the subclass constructor."); 
    } 
} 
+0

http://www.geeksforgeeks.org/g-fact-67/這看起來與您的示例非常相似,併爲參數化的構造函數添加了另一個示例。 –

+0

謝謝!這完全回答了我想了解的內容! –

+0

@MalteHartwig當一個類被加載並實例化時,不需要調用構造函數。當你構造一個對象時,它使用構造函數進行初始化,但是在初始化一個類時沒有涉及構造函數。 –

0

因爲你調用構造函數包括print語句。

您調用構造函數方法SubClass2(),其中有一個打印語句。

0

的語句印刷因爲類IST加載,而是因爲在那個類的一個對象實例化,並且構造函數的調用:

即一類可以在不使用構造被加載由以下證明代碼:

public class Test { 

    public static void main(String[] args) { 
     try { 
      Class.forName("Test$Inner"); 
     } catch (ClassNotFoundException e) { 
      e.printStackTrace(); 
     } 
    } 

    static class Inner { 
     static { 
      System.out.println("static initializer"); 
     } 
     public Inner() { 
      System.out.println("inner ctor"); 
     } 
    } 
} 

運行該程序顯示只調用靜態類初始化程序並且沒有構造函數。

相關問題