2017-04-22 85 views
0
public class LinkedListStructs { 
    public LinkedList l1 = new LinkedList(); 

    public LinkedListStructs(){ 
     ListNode h1 = new ListNode(4); 
     ListNode h2 = new ListNode(3); 
     ListNode h3 = new ListNode(12); 
     ListNode h4 = new ListNode(9); 
     ListNode h5 = new ListNode(9); 
     ListNode h6 = new ListNode(4); 
     l1.head = h1; 
     h1.next = h2; 
     h2.next = h3; 
     h3.next = h4; 
     h4.next = h5; 
     h5.next = h6; 
    } 

} 

然後我在其他類擴展這樣的:擴展Java中的類不初始化

public class Tester extends LinkedListStructs{ 

    public void removeDupsTest(){ 
     l1.printList(); 
     l1.removeDups(); 
     l1.printList(); 
     } 

    } 

我沒有初始化的LinkedListStructs一個新的實例。我的問題是,當我擴展一個類時,是否會自動創建一個實例?

我很困惑,因爲我在測試類中使用LinkedList l1,但對象本身需要一個構造函數初始化爲您​​3210

所以你們看到,它是如何工作的?如果我不創建一個實例,初始化鏈表的屬性,那麼如何使用它?

感謝

+0

子類可以訪問超類的所有「public」和「protected」字段。 – 4castle

+1

當你初始化你的子類時,你的超類首先被初始化! –

+0

您不應使用與廣泛使用的標準API類型相匹配的非限定類型名稱。此外,如果你實現了一個列表或其他容器類型,那麼你應該對它所包含的類型進行泛化。 –

回答

3

要使用Tester,你必須創建它的一個實例。當你創建它時,你正在調用它的構造函數。

由於您沒有指定構造函數,因此編譯器會爲您創建一個構造函數。你的空構造函數將調用超類的構造函數。

要測試此操作,請在TesterLinkedListStructs構造函數中爲您的Tester類和printLns添加一個空的構造函數。您將看到名爲的測試器構造函數,然後調用超類的構造函數。

請注意,您的空構造函數必須調用super(),它調用超類的構造函數。

+0

請注意,編譯器提供的構造函數缺少定義的構造函數的術語是「default constructor」。這是Java的一個重要且基本的概念。請注意,程序員提供的無參數構造函數不是默認的構造函數,因爲它是在類中定義的。只有在類中沒有定義構造函數時,纔會得到一個默認的構造函數。 –

+1

你是對的,我的答案應該包含這些細節 –

1

Java的數字出來給你:當您擴展,有一個參數的構造函數的一類,而沒有定義構造函數,派生類自動獲得一個默認的構造函數:

JLS節8.8.9:

如果一個類不包含構造函數聲明,那麼會自動提供一個不帶參數的默認構造函數。

如果聲明的類是原始類Object,則默認的構造函數具有空的主體。否則,默認構造函數只是簡單地調用沒有參數的超類構造函數。

當你構建的Tester一個實例,其基類LinkedListStructs的構造函數被調用,初始化列表l1

+0

關於「延長課堂」實際上並不是規則的一部分。無論何時,只要類沒有提供默認構造函數,都會提供默認構造函數。超類沒有無參數構造函數的問題不在於子類是否獲得默認構造函數,而是它是否會起作用。如果調用的構造函數不存在,隱式調用'super()'將不起作用。這是所有構造函數都關心的問題,無論是顯式還是默認。 –

1

要回答你的疑問:

既然你已經擴展了LinkedListStructs並創建了一個新的類測試儀(的「公共類測試儀擴展LinkedListStructs」的意思)

所有的行爲將在獲得的可用(或擴展)類。這是繼承的基礎(因此是可重用性)。你也可以選擇重寫它。這是爲了多態(你可以有'實現'來實現這個)。

因爲在Tester類中沒有顯式構造函數。默認的構造函數將被調用,它將調用它的所有超類構造函數。Default constructor文檔可以在這裏找到。

我想這就是你的問題的直接答案。

+0

這個答案唯一的錯誤是它引用了維基百科。至少那篇文章反過來引用了JLS,但是,即使上面的錯誤答案仍然引用了正確的JLS段落。像這樣的正確答案當然應該。 –

+0

謝謝Lew Bloch,我已經更新了參考點JLS。 – arunk2