1. 程式人生 > >方法過載和方法重寫

方法過載和方法重寫

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

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