1、方法重載(@overload)
java中,同一個類中出現了相同名字的方法,稱爲方法重載。
規則:兩同一不同(無其他要求,比如返回值、修飾符等均可相同或不同)
- 同一個類中、方法名相同
- 形參列表不同(形參個數不同、形參類型不同)
在java重載一文中有詳細介紹。
2、方法重寫(@override)
java中,子類中包含與父類同名的方法,稱爲方法重寫。
規則:兩同兩小一大
- 方法名相同、形參列表相同
- 子類方法的返回值類型需小於等於父類方法的返回值、子類聲明拋出的異常需小於等於父類聲明拋出的異常
- 子類方法的訪問權限應大於等於父類方法的訪問權限
尤其注意:被重寫的方法要麼都是類方法、要麼都是實例方法,不能一個是類一個是實例
class Base{
public static void info() {
//類方法
}
}
public class t extends Base {
//方法重寫錯誤,因爲在父類中info是類方法,但是子類中是實例方法
public void info() {
}
}
如果父類中的方法被private修飾,那麼此時子類無法訪問該方法,如果在子類中出現與父類相同名字的方法,這不是方法重寫,只是在子類中定義了一個新的方法。此時這兩個同名的方法可以一個是類方法,一個是實例方法。
class Base{
//類方法,並且不能被子類訪問
private static void info() {
}
}
public class t extends Base {
//不是方法重新,只是在子類中定義了一個新的方法
public void info() {
}
}
如何在子類中調用被子類重寫的父類方法? 使用Super限定
子類重寫了父類的方法,那麼子類的對象將無法訪問父類中被子類覆蓋的方法,但可以使用super(實例方法)、類名(類方法)來調用該父類方法。
class Base{
int age;
//父類的info方法
public void info() {
System.out.println("Hello world");
}
}
class Sub extends Base{
//方法重寫
public void info() {
System.out.println("Hello China");
}
//子類的新方法,在該方法中,想要調用父類的info方法,因此需要使用super限定,如果沒有super,則默認是調用子類的info方法,則輸出的是:Hello China
public void fun() {
super.info();
}
}
public class t{
public static void main(String[] args) {
Sub s=new Sub();
s.info();
s.fun();
}
}
輸出結果:Hello China
Hello world