1. 程式人生 > >再探Java子類方法重寫父類方法遵循“兩同兩小一大”規則

再探Java子類方法重寫父類方法遵循“兩同兩小一大”規則

今天在牛客碰到這樣一道題:

class A {
	public A foo() {
		return this;
	}
}

class B extends A {
	public A foo() {
		return this;
	}
}

class C extends B
{
    //這樣填寫什麼程式碼不會報錯
}

選項分別是:
A.public void foo(){}
B.public int foo(){return 1;}
C.public A foo(B b){return b;}
D.public A foo(){return A;}
正確答案:C

複習一下子類方法重寫父類方法遵循“兩同兩小一大”的規則

子類覆蓋父類要遵循“兩同兩小一大

兩同”即方法名相同,形參列表相同

兩小”指的是子類方法返回值型別應比父類方法返回值型別更小或相等,子類方法宣告丟擲的異常類應比父類方法宣告丟擲的異常類更小或相等。

(注:看到有網友有這樣的疑問,父類方法返回值是double,子類修改成int為什麼不行呢?

這是因為返回值型別更大或者更小,是對於同一型別而言的。也就是說,返回值的型別需要有繼承關係才去考慮大小這個概念。型別不同,肯定不是方法重寫

一大”指的是子類方法的訪問許可權應比父類方法的訪問許可權更大或相等。

注意:覆蓋方法和被覆蓋方法要麼都是類方法,要麼都是例項方法,不能一個是類方法一個是例項方法,否則編譯出錯。


所以,根據這個原理,再來分析上面這道題。

A.public void foo(){}
返回值型別與父類不一致,所以不可能是方法的重寫。又因為方法名相同,那麼只能是方法過載,而方法過載有需要滿足三個條件:形參個數、順序、型別必須有一者不同,A選項都不滿足,錯
B.public int foo(){return 1;}
與A選項一樣
C.public A foo(B b){return b;}
返回值型別與父類相同,但由於引數列表不同,所以是對父類方法的過載
D.public A foo(){return A;}
   語法錯誤