[英]Extending a class in Java without initializing
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;
}
}
然后在另一堂課中擴展它:
public class Tester extends LinkedListStructs{
public void removeDupsTest(){
l1.printList();
l1.removeDups();
l1.printList();
}
}
我沒有初始化LinkedListStructs
的新實例。 我的問題是,當我擴展類時,是否會自動創建一個實例?
我很困惑,因為我在測試器類中使用了LinkedList l1
,但是對象本身需要使用構造函數進行初始化 ,就像在public LinkedListStructs(){}
看到的那樣
那么它是怎樣工作的? 如果我不創建實例,請初始化鏈接列表的屬性,然后如何使用它?
謝謝
要使用Tester
,您必須創建一個實例。 創建它時,您正在調用它的構造函數。
由於您尚未指定構造函數,因此編譯器會為您創建一個構造函數。 空的構造函數將調用超類構造函數。
要對此進行測試,請將一個空的構造函數添加到Tester類,並在Tester
和LinkedListStructs
構造函數中添加printLns。 您將看到tester構造函數被調用,該構造函數又將調用超類構造函數。
請注意,您的空構造函數必須調用super(),后者將調用超類構造函數。
Java為您解決了這一問題:當擴展具有無參數構造函數的類並且不定義構造函數時,派生類將自動獲得默認的構造函數:
JLS第8.8.9節:
如果類不包含構造函數聲明,則會自動提供不帶參數的默認構造函數。
如果要聲明的類是原始類Object,則默認構造函數的主體為空。 否則,默認構造函數將簡單地調用不帶參數的超類構造函數。
在構造Tester
的實例時,將調用其基類LinkedListStructs
的構造函數,從而初始化列表l1
。
回答您的疑問:
由於您已經擴展了LinkedListStructs並創建了一個新的類Tester(“公共類Tester擴展了LinkedListStructs”的意思)
所有行為將在派生(或擴展)類中可用。 這是繼承的基礎(因此是可重用性)。 您也可以選擇覆蓋它。 這是針對多態的(您可以使用“實現”來實現)。
因為,Tester類中沒有顯式的構造函數。 默認構造函數將被調用,該構造函數將依次調用其所有超類構造函數。 可以在此處找到默認的構造函數文檔。
我想那是您問題的直接答案。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.