java隐藏与覆盖_java中方法的隐藏和覆盖问题?
ok()方法在繼承時候發生覆蓋(重寫)了嗎?
發生了。在子類B中的ok()方法擁有父類方法相同的方法名和參數列表(signature),所以在這里發生了重寫。調用B類對象的ok()方法會print "b",父類方法被覆蓋。
如果是重寫了,那定義一個b類的對象還能再調用a類繼承的ok()函數嗎?
可以。方法就是利用super關鍵字。@陸萌萌 的答案已經解釋了。
a類的ok()函數是在子類中隱藏了嗎?能告訴我覆蓋和隱藏分別應該怎么用怎么寫嗎?
錯誤。我回答這個問題主要就是為了說明這個易混點。
在Java中并沒有隱藏的概念,只有重載overload和重寫override,隱藏(redifine)是C++中的概念,網絡上很多人將之帶到了Java,以為在Java中也有這樣的區分。
1.) 在C++中,同一類內相同函數名不同參數列表的函數為重載;
2.) 父類與子類間相同名字相同參數列表,且父類函數有virtual標識符的為重寫;
3.) 父類與子類間相同名字不同參數列表,此時無論有無virtual標識符,或者父類與子類間相同名字相同參數列表,但是父類函數中沒有virtual標識符,則為隱藏,或者說重定義redifine。
Java中,情況簡化了許多。Java里沒有virtual標識符,按照上面三種情況劃分:
1.) 同一類內相同方法名不同參數列表的方法為重載;
2.) 父類與子類間相同名字相同參數列表,為重寫(覆蓋),這里與C++的區別是,Java中不需要有virtual標識符;
3.) 父類與子類間相同名字不同參數列表,此時按C++中的邏輯應該算是重定義(隱藏), 但是Java中沒有隱藏的概念。在具體實現中,父類中的函數,會被繼承下來,和子類中的同名函數,一起成為子類中的重載函數 。這個實現其實是與重載的定義相悖的,因為重載要求必須是在同一類內的相同名字不同參數列表的方法,而在這里,重載跨越了父類與子類。
以下為實際測試代碼:
class a{
public void ok()
{system.out.println("a");}
}
class b extends a{
public void ok(int c)
{system.out.println("b");}
}
class hello{
public static void main()
{
a A =new b();
A.ok();
A.ok(1);
}
}
在Java中,這里程序會輸出"a b"。子類對象中隱式地包含了ok(),ok(int c)兩個重載方法。
在C++中,同樣結構的代碼,這里會出現編譯錯誤,因為父類中的ok()被子類的ok(int c)隱藏,在子類對象中根本找不到ok()這個函數。
相比較而言,C++規范更明確,每種情況條分縷析;Java在實現上雖然更簡單方便,但其實與重載的定義是相悖的。
總結
以上是生活随笔為你收集整理的java隐藏与覆盖_java中方法的隐藏和覆盖问题?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java super是什么意思_java
- 下一篇: java post webservice