JAVA過載(overload)和覆蓋(override)中你所不知道的陷阱
大家都知道過載是指在同一個類中,定義了有相同名稱但是有不同引數型別的方法時,到底呼叫那一個方法會根據引數型別來選擇.我們來看下面這個例子:
- public class ParentClass {
- }
- public class ChildClass extends ParentClass{
- }
- public class Test {
- public void testOverLoad(ParentClass cls){
- System.out.println("It's ParentClass");
- }
- public void testOverLoad(ChildClass cls){
- System.out.println("It's ChildClass");
- }
- public static void main(String[] args) {
- Test test = new Test();
- ParentClass parentCls = new ParentClass();
- ParentClass childCls = new ChildClass();
- test.testOverLoad(parentCls);
- test.testOverLoad(childCls);
- }
- }
大家想想輸出的結果應該是什麼呢,答案是:
It's ParentClass
It's ParentClass
原因是決定方法過載是在編譯的時候發生,而不是在執行的時候.
覆蓋是指在父類和子類有相同名稱引數的方法,子類的方法覆蓋父類的方法.來看下面的例子:
- public class ParentClass {
- public String str1 = "Parent1";
- public String str2 = "";
- public ParentClass(){
- str2="Parent2";
- }
- public void func(){
- System.out.println("ParentClass.func");
- }
- public String getStr2() {
- return str2;
- }
- }
- public class ChildClass extends ParentClass{
- public String str1 = "Child1";
- public String str2 = "";
- public ChildClass(){
- str2="Child2";
- }
- public void func(){
- System.out.println("ChildClass.func");
- }
- public String getStr2() {
- return str2;
- }
- }
- public class Test
- public static void main(String[] args) {
- ParentClass childCls = new ChildClass();
- System.out.println(childCls.str1);
- System.out.println(childCls.str2);
- System.out.println(childCls.getStr2());
- childCls.func();
- }
- }
輸出的結果應該是什麼呢,答案是:
Parent1
Parent2
Child2
ChildClass.func
原因是對於方法的覆蓋發生在執行時,所以子類的方法被呼叫.而對於變數的覆蓋是在編譯的時候決定的,childCls在編譯的時候型別是ParentClass,所以對變數的直接訪問得到的是ParentClass中定義的值.對於成員變數,編譯器會對父類和子類的所有成員變數都儲存一份拷貝.
相關文章
- Java 重寫(Override)與過載(Overload)JavaIDE
- Java-override重寫與overload過載JavaIDE
- override(重寫) and overload(過載)IDE
- override與過載(overload)的區別IDE
- Java中的過載和覆蓋的細微差別 - rajivprabJava
- Java 中的 override 和 overload,看這一篇就夠JavaIDE
- Overload 和 和 Override 的區別IDE
- C#關鍵字之過載overload、重寫override、覆寫overwrite(new)詳解C#IDE
- Java繼承中成員方法的overload(過載/過載)Java繼承
- 物件導向重寫(override)與過載(overload)區別物件IDE
- C++之過載覆蓋和隱藏C++
- 過載(Overload)和重寫(Override)的區別。過載的方法能否根據返回型別進行區分IDE型別
- override 與overload 的區別IDE
- override與overload的區別IDE
- Java方法覆蓋和變數覆蓋的區別詳解Java變數
- override 與 overload 的區別+例子IDE
- 關於程式碼覆蓋率,你不可不知的兩大陷阱!
- 二十二、SpringCloud分散式微服務雲架構之Java 重寫(Override)與過載(Overload)SpringGCCloud分散式微服務架構JavaIDE
- 你所不知道的面試陷阱,巧妙避開,面試不再步步驚心面試
- C++中的覆蓋和隱藏C++
- C++ 成員函式的過載,繼承,覆蓋和隱藏C++函式繼承
- JavaScript中你所不知道的陣列ArrayBufferJavaScript陣列
- 你所不知道的cssCSS
- 你所不知道的 POST
- Java中@Override的作用JavaIDE
- JAVA中 @Override 的作用JavaIDE
- Python中你所不知道的“隱藏技巧”!Python
- 語法:Python中的可覆蓋物件與不可覆蓋物件Python物件
- 你所不知道的Java效能優化之String!Java優化
- 你所不知道的python 迴圈中的elsePython
- 你所不知道的JavaScript 二JavaScript
- 你所不知道的JavaScript(三)JavaScript
- Java中的過載和重寫Java
- Performanced C++ 經驗規則(5):再談過載、覆蓋和隱藏ORMC++
- 你可能不知道的陷阱:C#委託和事件的困惑C#事件
- 你所不知道的軟體開發的詳細過程
- 重寫、覆蓋、過載、多型幾個概念的區別分析多型
- 你所不知道的虛擬化和雲端計算