天天看點

方法重載和方法重寫

方法重載:(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();
}
           

注:以上文章僅是個人學習過程總結,若有不當之處,望不吝賜教。