簡體   English   中英

在不初始化的情況下擴展Java類

[英]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類,並在TesterLinkedListStructs構造函數中添加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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM