java基礎——重寫、隱藏、過載
方法簽名:方法名+引數列表(引數型別、個數、順序)
重寫:
子類重寫父類方法,僅限於例項方法。成員變數和靜態方法不能被重寫,只能被隱藏。
重寫原則:
1.方法名相同,引數型別相同。
2.子類返回型別小於等於父類返回型別。
3.子類異常小於等於父類異常。
4.子類訪問許可權大於等於父類訪問許可權。
重寫方法可以改變其他方法修飾符如final,synchronize,native等。不管被重寫方法中有無final修飾的引數,重寫方法都可以增加、保留、取出這個引數的final修飾符,即引數修飾符不屬於方法簽名。
過載:
同一個類中,有多個方法名相同,引數列表不同(個數、型別不同),與返回值無關,與許可權修飾符無關(
java中方法可以與類重名,構造方法沒有返回值。
隱藏:
形式上與重寫類似,但只有成員變數和靜態方法可以被隱藏。
3、隱藏和覆蓋的區別(https://blog.csdn.net/snow_7/article/details/51579278)
(1)被隱藏的屬性,在子類被強制轉換成父類後,訪問的是父類中的屬性
在無強制轉換時子類要訪問父類的屬性使用super關鍵字
(2)被覆蓋的方法,在子類被強制轉換成父類後,呼叫的還是子類自身的方法
子類要是想訪問父類的方法,可以使用super關鍵字
public class Test { public static void main(String[] args) { Circle circle = new Circle();//本類引用指向本類物件 Shape shape = new Circle();//父類引用指向子類物件(會有隱藏和覆蓋) System.out.println(circle.name); circle.printType(); circle.printName(); //以上都是呼叫Circle類的方法和引用 System.out.println(shape.name);//呼叫父類被隱藏的name屬性 shape.printType();//呼叫子類printType的方法 shape.printName();//呼叫父類隱藏的printName方法 } } class Shape { public String name = "shape"; public Shape(){ System.out.println("shape constructor"); } public void printType() { System.out.println("this is shape"); } public static void printName() { System.out.println("shape"); } } class Circle extends Shape { public String name = "circle"; //父類屬性被隱藏 public Circle() { System.out.println("circle constructor"); } //對父類例項方法的覆蓋 public void printType() { System.out.println("this is circle"); } //對父類靜態方法的隱藏 public static void printName() { System.out.println("circle"); } }
//執行結果:
shape constructor
circle constructor
circle
this is circle
circle
shape
this is circle
shape
可以看到轉到父類物件後,重寫的呼叫的是自己的靜態方法或成員變數,隱藏的呼叫的是父類的靜態方法或成員變數。
參考:
1. https://github.com/kdn251/interviews
2. https://blog.csdn.net/snow_7/article/details/51579278
3.https://blog.csdn.net/weixin_42294335/article/details/80427124