你認為有幾種方法?
一種?兩種?三種?
你以為除了使用 final 關鍵字以外還有其他方法?
這是昨天面試時被問到的,面試時我答使用 final 關鍵字,年輕的面試官突然問:“還有嗎?”(果然沒那么簡單?)
我不解,只好反問他:“還有什么方法?我還沒聽說過,可以指點一下。”
面試官所謂的“第二種”不讓類別繼承的方法
他緩緩說道:“子類一定會調用父類的什么方法?”不解,追問之。他說“構造器”。
我:“為什么子類一定要調用父類構造器?”
面試官:“父類沒有構造器提供的時候,子類還能繼承嗎?”
我:“沒有默認無參構造器,代表父類寫了其它的帶參構造器,子類自己手寫對應構造器就可以了。”
(好像是我的話提醒了他......)
面試官:“如果父類構造器私有,子類還能繼承嗎?”
我:“這個我就不太確定了。”
回家測試
確實除了final關鍵字,私有化構造器也能讓類變得不可繼承。因為子類構造器中需要調用父類構造器,如果父類一個可用的構造器都不提供,那么就無法繼承這個“父類”了。
不過測試發現,內部類之間卻可以打破這個限制。這樣的話使內部類之間不可繼承還是只有final關鍵字一種方法。測試效果如下兩張圖所示:
小結:
java中想讓普通類不可被繼承有兩種方法:一種是通過final關鍵字;第二種是私有化構造器,讓子類無可用的“父類”構造器可用,也就無法繼承。
而java中內部類卻可以打破上述第二種方法中所描述的限制,因此想要內部類之間不能被繼承的話,只有一種方法:final關鍵字。