java 繼承 兩同兩小一大,方法返回值小的理解
阿新 • • 發佈:2021-02-01
原始碼如下:
package test;
public class Test {
public static void main(String[] args){
// 多型
B a = new A();
// 這樣會報錯,因為 D 沒有該方法
// System.out.println(a.test().a());
System.out.println(a.test().testValue);
}
}
class A extends B{
@Override
public C test(){
System.out.println("呼叫 A 的 test() 方法");
return new C();
}
}
class B{
public D test(){
System.out.println("呼叫 B 的 test() 方法");
return new D();
}
}
class C extends D {
public int testValue = 10000;
public void a(){}
}
class D {
public int testValue = 12345;
}
執行結果:
總結:
看上面的結果可以知道,系統內部實際上是做了一個向上轉型的操作。如果子類返回值的範圍 比 父類的 要大的話,例如 子類重寫的方法的返回值為Number,父類為 Integer。此時,系統需要做的是向下轉型,很有可能會轉型失敗。因此子類的方法的返回值型別應該 和 父類的 相等或更小