[英]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
? 或者First
是Third
超類?
如果有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.