簡體   English   中英

擴展子類的子類中的super()構造函數?

[英]super() constructor within a subclass that extends a subclass?

我不確定我的問題是否正確,但我對這些代碼行感到困惑。

public class First {
    public String name() {
        return "First";
    }
}

public class Second extends First {
    public void whoRules() {
        System.out.print(super.name() + " rules");
        System.out.println(" but " + name() + " is even better");
    }
    public String name() {
        return "Second";
    }
}

public class Third extends Second {
    public String name() {
        return "Third";
    }
}

Second varSecond = new Second();
Third varThird = new Third();
varSecond.whoRules();
varThird.whoRules();

執行上述操作后,將打印出來

First rules but second is even better

First rules but third is even better

為什么不是:

First rules but second is even better

Second rules but third is even better

子類可以是另一個類的超類嗎? 或者只能有一個(超類)? (使用示例代碼段)據我所知, First是一個超類Second ,但Second對一超Third 或者FirstThird超類?

如果有10個類相互延伸(第二個擴展第一個,第三個擴展第二個,等等)所有這些類的超類是否會是First ?)

為什么不會:......“第二條規則,但第三條規則更好”

因為類Second中的super.name()引用了Second的超類,而不是實例的超類。

Java語言規范表單super.Identifier引用當前對象的名稱Identifier的字段,但將當前對象視為當前類的超類的實例。

子類可以是另一個類的超類嗎?

是。

或者只能有一個(超類)?

每個類最多可以有一個直接超類,而超類又可以有超類等。

(使用上面的示例代碼)我理解First是Second的超類,但是Second是Second的超類? 或者首先是第三個超類?

First和Second都是Third的超類。

其次是Third的直接超類。

Third varThird = new Third();

由於Third類沒有whoRules()方法。 它調用超類方法。

如果在調用期間未指定任何對象,則編譯器使用“this”關鍵字進行調用。 這就是為什么,this.name()打印“Third”作為whoRules()方法被第三個Class對象調用。因此結果 - “第一個規則,但第三個甚至更好。”

這是因為你從Second類調用super,它從First類調用super.name()。 第二個超級永遠是第一位的

這是簡單的繼承。 第一個是第二個超級類,第二個是超級第三類。 基本上,當您創建第三類的對象時,它將從父類繼承所有(非私有)屬性,這些屬性都是First和Class。

First -> Second -> Third 

超級關鍵字 - 在給定的示例中,您將重寫(在子類中實現超類方法)超類的方法名稱()在子類second中使用第一個。使用關鍵字super.name()可以調用名稱()超類的方法。

我想讓你記住的最重要的事情是

java編譯器調用基於Reference類型而不是對象類型的方法

當你說

varSecond.whoRules();

在這種情況下,對象引用屬於類Second

System.out.print(super.name() + " rules");//calls the name() in class First
System.out.println("but" + name()+"is even better");//calls the name() in class Second

但是當你說

varThird.whoRules();

在這種情況下,對象引用屬於第三類

System.out.print(super.name() + " rules");//calls the name() in class First
System.out.println("but" + name()+"is even better");//calls the name() in class Third

只是因為name()方法是在第三類中定義的。 如果你沒有在第三類中定義name()方法,那么它將調用超類方法。

並且回答你的另一個問題,對繼承的深度沒有硬限制,但通常你不會在一個好的設計中看到層次結構中的10個超類。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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