方法重載:(Overload)
方法重載發生在類中的幾個方法上,每個重載方法的參數類型或參數的數量必須是不同的。雖然每個重載方法可以有不同的傳回類型,但傳回類型并不足以區分使用的是哪個方法。demo:
public void show(int i){...}
public int show(int i,String s){return...}
方法重寫:(Override)
方法重寫發生在類的繼承中,子類覆寫父類的方法,但是要遵循以下規定:
(1)子類方法的名稱、參數名和傳回類型必須與父類方法的名稱、參數名和傳回類型一緻。
(2)子類方法不能縮小父類的通路權限(即父類方法是public,子類重寫方法不能小于public的權限)
為什麼不能小于呢??
父類方法為public,子類方法為private,那麼:
Fu f=new ZI();
f.方法。多态中,實際上對象f調用的是ZI類中的方法,那麼問題來了,你子類的方法是private,怎麼調用??編譯的時候不會報錯,但運作時會報錯。
(3)子類方法抛出的異常必須和父類方法抛出的異常相同,或者是父類方法抛出異常的子類。為什麼呢??
假設你抛出的是其他異常,同樣會和多态沖突:
Fu:方法 Exception1{...}
Zi: 方法 Exception2{...}
Test(測試):
Fu f=new Zi();
try{
f.方法;
}catch(Exception1 e){...}存在的問題就捕獲不到異常。
(4)方法覆寫隻能存在于子類和父類(包括直接父類和間接父類)之間。在同一個類中方法隻能被重載,不能被覆寫。
(5)父類的靜态方法不能被子類覆寫為非靜态方法。
(6)子類可以定義與父類的靜态方法同名的靜态方法,以便在子類中隐藏父類的靜态方法。
子類隐藏父類的靜态方法和子類覆寫父類的執行個體方法,這兩者的差別在于:運作時,Java虛拟機把靜态方法和所屬的類綁定,而把執行個體方法和所屬的執行個體綁定。
class Fu {
public void method() {
System.out.println("method of Fu");
}
public static void staticMethod() {
System.out.println("static of Fu");
}
}
class Zi extends Fu {
public void method() {
System.out.println("method of Zi");
}
public static void staticMethod() {
System.out.println("static of Zi");
}
}
public class Book_09 {
public static void main(String[] args) {
Fu z = new Zi();
z.method();
z.staticMethod();
Zi z2 = new Zi();
z2.method();
z2.staticMethod();
}
}
//運作結果:
method of Zi
static of Fu
method of Zi
static of Zi
實際上JDK也不建議通過執行個體對象調用靜态方法(會給出警告,說建議使用類名調用),但是原理也依舊是要懂的,就是靜态方法和類綁定,執行個體方法和執行個體綁定。同理變量(無論是靜态還是非靜态)的覆寫也是和類綁定的。子類中若想使用父類的變量,即可這樣寫super.變量名。靜态方法中不可以使用super。
(7)父類的費靜态方法不能被子類覆寫為靜态方法。
(8)父類的私有方法不能被子類覆寫。
(9)父類的抽象方法可以被子類通過哪兩種途徑覆寫:一種是子類實作父類的抽象方法;另外一種是子類重新聲明父類的抽象方法。
(10)父類的非抽象方法可以被覆寫為抽象方法。
class Fu{
public void show(){...}
}
calss Zi extends Fu{
public abstract void show();
}
注:以上文章僅是個人學習過程總結,若有不當之處,望不吝賜教。