interface?A
{
????default?String?getName(){return?getClass().getName()?+?"-"?+?hashCode()}
}
interface?B
{
????default?String?getName(){return?getClass().getName()?+?"-"?+?hashCode()}
}
class?C?implements?A,B
{
????public?String?getName(){return?B.super.getName();}
}如圖這段代碼,我想問的是類C中調(diào)用B類的getName時(shí)為什么不能直接 ?B.getName( ) ? 而是B.super.getName( )這樣寫豈不是調(diào)用的是B的超類的getName()方法了嗎??是因?yàn)榉庆o態(tài)方法不能直接調(diào)用?可是B類中g(shù)etName方法已經(jīng)重寫了吧,用B類超類中的getName()方法就不一樣了吧??請(qǐng)大神解答一下!
2 回答

四無(wú)小青年
TA貢獻(xiàn)88條經(jīng)驗(yàn) 獲得超43個(gè)贊
這是java8的新特性默認(rèn)方法,默認(rèn)方法允許接口中存在帶方法體的方法且子類可以不用重寫,在加上接口可以多繼承,這就會(huì)出現(xiàn)一個(gè)類繼承多個(gè)接口而多個(gè)接口具有相同的方法簽名這種情況,這會(huì)造成歧義,外部直接調(diào)用子類的默認(rèn)方法時(shí)不能確定是調(diào)用那個(gè)接口的方法。
所以java8規(guī)定如果存在多繼承默認(rèn)方法沖突,子類需要重寫默認(rèn)方法,或者直接調(diào)用更上層的默認(rèn)方法來消除歧義,不然會(huì)編譯出錯(cuò)。這就是你所提的問題了,A和B存在相同方法,所以子類通過調(diào)用B父類的默認(rèn)方法來消除歧義。
若解惑,望采納
添加回答
舉報(bào)
0/150
提交
取消