2014-12-03 303 views
-1

有兩個類。一個從另一個繼承。自從我調用子類構造函數和它的方法以來,測試結果讓我感到驚訝 。不過,我不會像這樣調用超類構造函數new Cougar().go();。但是輸出顯示了超類構造函數被調用。你能解釋我爲什麼發生這種情況嗎?繼承構造函數調用結果

public class Feline { 
public String type = "f"; 

public Feline() { 
    System.out.println("feline"); 
} 
} 

public class Cougar extends Feline { 

public Cougar() { 
    System.out.println("cougar"); 
} 

public static void main(String[] args) { 
    new Cougar().go(); 
} 

private void go() { 
    type = "c"; 
    System.out.println(this.type + " " + super.type); 
} 

} 

輸出:貓 熟女 C C

回答

0

如果構造函數沒有明確調用父類的構造函數,Java編譯器會自動插入到超類的無參構造函數的調用。

總是調用超類的構造函數。你可以在你的子類構造函數的第一行中使用「super()」來調用你的超類的構造函數。

例如:

public class Feline { 
    public Feline() { 
     System.out.println("Feline"); 
    } 
    public Feline(String type) { 
     System.out.println(type); 
    } 
    ... 
} 

public class Cougar extends Feline{ 
    public Cougar() { 
     super("Cougar"); 
    } 
    ... 
} 
+0

如何避免此問題 – ramazankul 2014-12-03 11:47:14

+0

您無法避免調用超類構造函數。檢查編輯的答案可能的解決方案 – 2014-12-03 11:56:01

+0

在你的解決方案,美洲獅不擴展felina – ramazankul 2014-12-03 11:59:22

0

這是因爲線

new Cougar().go(); 

裏面你重新定義變量 「類型」 的 「走出去」 的方法。
我希望它是有道理的。

+0

我嘗試新的Cougar();而不是新的Cougar()。go();但結果是貓 美洲獅 。這意味着超級構造函數也被稱爲。 – ramazankul 2014-12-03 11:56:19

0

當我們調用子類構造函數時,java編譯器會自動調用超類 構造函數。如果它不在超類中,我們將得到編譯時錯誤。 如果Object是我們類的超類,那麼因爲Object包含無參數構造函數,所以沒有問題。

原因-有超級構造函數調用的原因是,如果超類可能有私人領域需要由其構造函數初始化。

Refer this link for more info.

+0

在我的問題的超級沒有私人字段 – ramazankul 2014-12-03 12:04:44

+0

原因表明你可以有私人字段。 – 2014-12-04 05:22:29

0

當你調用派生類中的運行時執行派生類的構造函數之前會自動調用無參數的基類構造函數的參數的構造函數。由於這種行爲,你會在你的輸出中看到貓頭鷹作爲前兩個字符串。

現在,對於輸出的'c c'部分,您並未在Cougar類中定義新的String類型變量。如果go()方法/函數中的超類並將其設置爲「c」,則使用相同的「類型」變量。這就是你在輸出中獲得'c c'的原因。

使Cougar如下。語法是C#。

public class Cougar : Feline 
{ 
    public String type = "c"; 

    public Cougar() 
    { 
     Console.Write("cougar "); 
    } 

    static void Main(String[] args) 
    { 
     new Cougar().go(); 
    } 

    private void go() 
    { 
     Console.Write(this.type + " " + base.type); 
    } 
} 
+0

感謝您的回答,但我的問題是爲什麼基類構造函數調用,儘管沒有在子類中調用 – ramazankul 2014-12-03 12:08:02

+0

這是一個Java運行時行爲調用派生構造函數時調用基類構造函數。全部是無參數構造函數。 – Mihir 2014-12-03 12:19:12