關於封裝、繼承和多態的概念這裏就不再贅述,本文只描述方法覆蓋(重寫)的條件及限制。
一:關於方法的覆蓋
1.什麼時候方法要進行重寫?
如果父類中的方法已經無法滿足當前子類的業務需求,需要將父類中的方法進行重新寫一遍。
2.子類如果重寫父類中的方法之後,子類對象一定調用的是重寫之後的方法。
3.發生方法覆蓋的條件:
- 發生在具有繼承關係的兩個類之間
- 必須具有相同的方法名,相同的返回值類型,相同的參數列表.
- 重寫的方法不能比被重寫的方法擁有更低的訪問權限。
- 重寫的方法不能比被重寫的方法拋出更寬泛的異常。(異常機制再講。)
- 私有的方法不能被覆蓋。
- 構造方法無法被覆蓋。因爲構造方法無法被繼承。
- 靜態的方法不存在覆蓋。
- 覆蓋指的是成員方法,和成員變量無關。
4.繼承最基本的作用:代碼重用。 繼承最重要的作用:方法可以重寫。
public class Test01{
public static void main(String[] args){
//創建子類對象
Cat c = new Cat();
//調用方法
c.move();
Animal a = new Animal();
a.move();
}
}
//父類:動物
class Animal{
//成員方法
public void move(){
System.out.println("動物在移動!");
}
}
//子類:貓
class Cat extends Animal{
//Cat的move方法應該輸出:貓在走貓步!
//Animal中的move方法已經無法滿足Cat了。
//所以要在Cat類中對Animal類中的move方法進行重新定義(方法的覆蓋,方法的重寫,Overwrite,Override)
public void move(){
System.out.println("貓在走貓步!");
}
}
私有的方法無法被覆蓋
//父類
class A{
//私有方法
private void m1(){
System.out.println("A'm1 method invoke!");
}
//入口
public static void main(String[] args){
//多態
A a = new B();
a.m1(); //A'm1 method invoke!
}
}
//子類
class B extends A{
//嘗試重寫父類私有的方法
public void m1(){
System.out.println("B'm1 method invoke!");
}
}
靜態的方法不存在覆蓋
public class Test03{
public static void main(String[] args){
A a = new B();
//靜態方法不存在覆蓋,因爲靜態方法執行和對象無關。
a.m1(); //A's m1 method invoke!
A.m1();
B.m1();
}
}
class A{
//靜態方法
public static void m1(){
System.out.println("A's m1 method invoke! ");
}
}
class B extends A{
//嘗試重寫父類的靜態方法
public static void m1(){
System.out.println("B's m1 method invoke! ");
}
}