[英]Java method overriding and inheritance
class Dad {
private static final String me = "dad";
protected String getMe() {
return me;
}
protected void printMe() {
System.out.println(getMe());
}
}
class Son extends Dad {
private static final String me = "son";
protected void printMe() {
System.out.println(getMe());
}
}
class Test {
public static void main(String[] args) {
Son son = new Son();
son.printMe();
}
}
在這種情況下,引用類型為“ Son”的“ son”,並且由於方法printMe()是非靜態的,因此將執行來自類Son的方法的代碼。 但是,由於Son類尚未重新定義方法getMe(),因此將執行祖先類中的方法代碼。 所以我們得到“爸爸”。
第二種情況:
class Dad {
private static final String me = "dad";
protected String getMe() {
return me;
}
protected void printMe() {
System.out.println(getMe());
}
}
class Son extends Dad {
private static final String me = "son";
protected String getMe() {
return me;
}
class Test {
public static void main(String[] args) {
Son son = new Son();
son.printMe();
}
}
在這種情況下,Son類沒有以類似的方式進行推理,因此未執行方法printMe()的定義,因此應執行類Dad中方法printMe()的代碼。 但是我們得到“兒子”。為什么?
然后繼承呢? 也就是說,如果繼承人沒有覆蓋祖先方法,那么他們一起共享祖先方法的代碼嗎?
在第一種情況下, son.printMe()
調用Son
的printMe()
(因為Son
重寫了該方法),后者調用了Dad
的getMe()
(因為Son
沒有重寫該方法),該方法返回“ dad”。
在第二種情況下, son.printMe()
調用Dad
的printMe()
(因為Son
並未重寫該方法),后者又調用Son
的getMe()
,因為Son
重寫了該方法。 因此,“兒子”被打印。
在第二種情況下,您要調用Dad#printMe
,后者依次調用getMe
。 由於Son
確實覆蓋了它, Son#getMe
將調用Son#getMe
。 該方法返回“ Son”,然后由printMe
打印。
您正在使用tge diff類覆蓋相同的方法,但是參數相同,因為tge main方法正在調用son方法
案例2: son.printMe()
將調用Dad
級printMe()
作為未未在everriden Son
類。 現在它將在getMe()
中最接近的實現類(即Son
類getMe()
中查找getMe()
。 現在, Son#getMe()
將在此實現類中尋找變量me
,並找到值"son"
,因此將其打印出來。 請記住, private static final String me = "dad";
和private static final String me = "son";
是兩個不同的私有變量,屬於兩個不同的類。 如果Son
類中沒有定義me
變量,則將出現編譯錯誤。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.