所謂方法的覆寫override就是子類定義了與父類中同名的方法,但是在方法覆寫時必須考慮權限,即被子類覆寫的方法不能擁有比父類方法更加嚴格的訪問權限。
修飾符分別為public、protected、default、private。他們的訪問權限如下圖所示。

用public修飾的類在本類、同包、子類、其他包中互相訪問都是可以的。
用protected修飾的類在本類、同包、子類中互相訪問都是可以的,protected不可以在包外沒有繼承關系的類中互相訪問。
就說明用default修飾的類在本類、同包中互相訪問都是可以的,default不可以在包外不管有沒有繼承關系的類都不可以互相訪問。
用private修飾的類只能在本類中訪問。
它們的訪問權限大小是 public > protected > default > private;
如果在父類中的使用public定義的方法,則在子類中的訪問權限必須是public,否則程序無法通過編譯。
class Person{
void print(){
System.out.println("Person --> void print(){}");
}
}
class Student extends Person{
public void print(){
System.out.println("Student --> void print(){}"); //覆蓋父類中的方法,擴大了權限
}
}
public class OverrideDemo01 {
public static void main(String[] args){
new Student().print();
}
}
父類中定義的private方法,在子類中定義成default方法,這種不是方法的覆寫。
class Person{
private void print() {
System.out.println("Person --> void print(){}" );
}
public void fun() {
this.print();
}
}
class Student extends Person{
void print(){
System.out.println("Student --> void print(){}");
}
}
public class OverrideDemo04 {
public static void main(String[] args) {
new Student().fun();
}
}
輸出結果:Person --> void print(){}可見調用的方法是父類的方法,也就是說此時子類並沒有覆寫父類中的方法,而是子類中重新定義了一個新的方法。
父類子類中如果聲明了相同的屬性時,則在子類中直接訪問時一定采用“就近訪問原則”, 即先找到本類中的屬性,如果此時要調用父類中的屬性,直接使用“super.屬性”格式即可。
覆寫與重載的區別

