題目
下列程序會輸出什麼結果:(E)
class Super {
public int getLength() {
return 4;
}
}
public class Sub extends Super {
public long getLength() {
return 5;
}
public static void main (String[]args) {
Super super = new Super ();
Super sub = new Sub();
System.out.printIn(super.getLength()+ “,” + sub.getLength() };
}
}
A. 4, 4
B. 4, 5
C. 5, 4
D. 5, 5
E. 代碼不能被編譯
運行結果:
The return type is incompatible with Super.getLength()
分析:
這個問題就是考察方法重寫(override)
方法重寫的規則總結爲:
- “兩同”方法名相同,形參列表相同(即方法簽名相同)
- “兩小”子類方法返回值類型應比父類方法返回值類型更小或相等,子類方法聲明拋出的異常類應比父類方法聲明拋出的異常類更小或相等
- “一大”子類方法的訪問權限應比父類方法的訪問權限更大或相等
注意:
-
覆蓋方法和被覆蓋方法要麼都是類方法,要麼都是實例方法。
- 子類重寫的方法,如果返回值爲類類型,其返回值類型必須與父類返回值類型相同或爲父類返回值類型的子類。
這裏如果返回值類型改成 包裝類型的話,有兩點不滿足:
- 首先父類的是Integer 子類是 Long 很明顯 Long要比Integer 要大
- Integer 和 Long 不存在繼承關係 ,也就沒有了父類子類之說