Java 覆寫(Override)詳解
阿新 • • 發佈:2019-01-11
一、覆寫概念
既然現在出現了繼承的關係,那麼就存在了子類和父類的聯絡,而在子類之中有可能定義和父類完全相同的方法或屬性的名稱,這個時候就稱為覆寫了。
二、方法的覆寫
當子類定義了和父類在方法名稱、返回值型別、引數型別及個數完全相同的方法的時候,稱為方法的覆寫。
沒有覆寫的操作:
package com.wz.overridedemo;
class A {
public void print() {
System.out.println("Hello World .");
}
}
class B extends A {
}
public class Test {
public static void main(String args[]) {
B b = new B();
b.print(); // 方法從父類繼承而來
}
}
執行結果:
Hello World .
這時例項化的是子類物件,但是在子類中沒有print()方法,那麼就使用從父類中繼承而來的pritn()方法。
實現覆寫:
package com.wz.overridedemo;
class A {
public void print() {
System.out.println("Hello World ." );
}
}
class B extends A {
public void print() { // 方法名稱、引數型別及個數、返回值全相同
System.out.println("世界,你好!");
}
}
public class Test {
public static void main(String args[]) {
B b = new B();
b.print(); // 方法從父類繼承而來
}
}
執行結果:
世界,你好!
當一個類中的方法被覆寫後,如果例項化的是這個子類物件,則呼叫的方法就是被覆寫過的方法。
在進行方法覆寫的時候有一點需要注意:被子類所覆寫的方法不能擁有比父類更嚴格的訪問控制權限。
如果此時父類之中的方法是default許可權,那麼子類覆寫的時候只能是default或public許可權,而如果父類的方法是public,那麼子類之中方法的訪問許可權只能是public。
當一個子類覆寫了一個父類方法的時候,子類要想呼叫父類的被覆寫過的方法,要在方法前要加上“super”:
package com.wz.overridedemo;
class A {
public void print() {
System.out.println("Hello World .");
}
}
class B extends A {
public void print() {
super.print();
System.out.println("世界,你好!");
}
}
public class Test {
public static void main(String args[]) {
B b = new B();
b.print(); // 方法從父類繼承而來
}
}
執行結果:
Hello World .
世界,你好!
一定要記住操作範圍:
(1)this.方法():先從本類查詢是否存在指定的方法,如果沒有找到,則呼叫父類操作;
(2)super.方法():直接由子類呼叫父類之中的指定方法,不再找子類。
問題來了:請問以下的操作是覆寫嗎?
package com.wz.overridedemo;
class A {
private void print() {
System.out.println("Hello World .");
}
public void fun() {
this.print();
}
}
class B extends A {
public void print() { // 不叫覆寫
System.out.println("世界,你好!");
}
}
public class Test {
public static void main(String args[]) {
B b = new B();
b.fun(); // 方法從父類繼承而來
}
}
執行結果:
Hello World .
首先從覆寫的概念上來講:現在父類的許可權是private,而子類是public,的確是擴大了許可權,而且方法的引數名稱及個數、返回值型別都一樣。但這種情況在開發之中是不會出現的,使用了private定義的操作都無法覆寫。
三、this和super的區別
四、方法過載與覆寫的區別