方法過載和方法重寫
方法過載:(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();
}
注:以上文章僅是個人學習過程總結,若有不當之處,望不吝賜教。