2013-02-05 68 views
0
public class ExtAA extends AA { 
    static int iTime; 

    public static void main(String argv[]) { 
     ExtAA d = new ExtAA(); 
     d.func(iTime); 
    } 

    public static void func(int iTime) { 
     System.out.println(iTime); 
    } 

    public ExtAA() { } 
} 



class AA { 
    public AA() { System.out.println("AA"); } 
} 

打印:爲什麼這不覆蓋類的構造函數?

AA 
0 

我本來期望public ExtAA() { }覆蓋構造爲AA,因此無法打印AA,只是0。有人可以解釋我錯了什麼,如果我想重寫構造函數,我怎麼能?

P.S.我的問題完全有可能是愚蠢的,但我不知道公衆應該或可以做什麼。這是一個測試,我搞砸了,我想知道實際發生了什麼(是的,我進入了調試和一步一步地去了,我只是不知道爲什麼new ExtAA使用AA而不是它自己定義構造函數)

+1

構造函數不能被覆蓋,而是從頂層到底層調用層次結構,即從Object類到繼承層次結構中的最後一個類。 –

回答

5

總是調用Java中超類的構造方法。你不能阻止這一點。如果有更多的構造函數被調用,你可以控制哪個構造函數被調用。

請考慮閱讀一些Java的基礎教程,這是Java OOP的基本東西。

隱式構造函數是這樣的:

public ExtAA() { 
    super(); // Constructor of super class call, always first line of code in child constructor 
} 
2

試想一下,如果你能跳過從基本的構造函數。它可能會使對象的父對象處於非常不穩定的狀態。

想想基類在構造函數中進行某種有意義的初始化的情況。如果沒有完成,那麼突然你的對象的基類部分在瘋狂的城鎮。這幾乎可以肯定,爲什麼Java決定像這樣工作。

作爲一個超級平凡的例子,想象一下如果你有一個擴展ArrayList的SortedArrayList類。如果SortedArrayList以某種方式不調用任何ArrayList構造函數,那麼您認爲該對象的內部構件是否有意義?某處會有一個空的數據結構,意味着事情會崩潰並燃燒。在某些情況下,重寫構造函數可能是有意義的,但顯然Java用戶認爲意外執行此操作的風險不值得這種能力(並且它在設計良好的類圖中很少有意義 - 如果子類不以某種方式依賴於基類,那麼爲什麼它是以子類開頭?)。

2

一個對象具有它自己的類的所有字段以及它的父類,祖父類的所有字段,一直到根類Object。有必要初始化所有字段,因此必須調用所有構造函數! Java編譯器會自動在構造函數鏈接過程中插入必要的構造函數調用,或者您可以顯式執行它。