Java中,覆蓋(Override)和隱藏(Hide)是兩個非常重要的概念,也是Java面向對象編程中的基本原理。
覆蓋指的是子類重寫父類中的方法,子類中的同名方法會覆蓋父類中的方法,使其具有與父類中方法同名但是不同實現的特性。
//父類 public class Animal { public void move(){ System.out.println("動物可以移動"); } } //子類 public class Dog extends Animal{ public void move(){ System.out.println("狗可以跑和走"); } } public class TestDog{ public static void main(String args[]){ Animal a = new Animal(); // Animal 對象 Animal b = new Dog(); // Dog 對象 a.move();//執行動物可以移動方法 b.move();//執行狗可以跑和走方法 } }
隱藏指的是子類中定義了與父類中同名但是參數列表不同的方法,此時,即使使用父類對象來調用該方法,也是調用子類中定義的方法,而不是父類中的方法。這種方法與父類中的方法是一個新的方法,不是對父類方法的覆蓋。
//父類 public class Animal{ public void move(){ System.out.println("動物可以移動"); } } //子類 public class Dog extends Animal{ public void move(String name){ System.out.println(name+"能夠跑和走"); } } public class TestDog{ public static void main(String args[]){ Animal a = new Animal(); // Animal 對象 Animal b = new Dog(); // Dog 對象 a.move();//執行動物可以移動方法 b.move();//編譯錯誤,無法通過編譯,因為move()方法參數不匹配 } }
在Java中,覆蓋和隱藏的規則如下:
- 方法覆蓋時,方法名、參數列表必須相同;返回值類型和訪問修飾符可以不同,但是返回值類型必須是子類返回值類型的子類;異常類型必須與超類中方法拋出異常的異常類型一致。
- 隱藏時,方法名必須相同,參數列表必須不同;訪問修飾符可以增強,但是不能降低;返回類型不同;拋出異常類型必須是被變更為非檢查異常。