[英](Beginner Java) Downcasting/Upcasting/Interface
我正在為考試而學習,但我陷入了以下問題。
可以編譯以下內容嗎? 如果是這樣,它將運行嗎? 輸出是什么?
e) IX i = new C(); A a = (A) i; a.doIt(1.0);
// --- Interfaces and classes
interface IX {void doIt(double d);}
class A implements IX {
public void doIt(double d){out.println("doIt A");}}
class B extends A {public void doIt(int i){out.println("doIt B");}
}
class C extends A{public void doIt(double d){out.println("doIt C");}
}
class D {public void doIt(double d){out.println("doIt D");}
}
因此,經過一些谷歌搜索后,我對此的理解是:
當我們說IX i = new C();
我們說的是:我們正在創建一個SOME類型的對象(它具有引用變量i
),但是無論它是什么類型,它都必須實現IX接口。 現在,該類型為C
好了,然后我們說引用變量a
引用a
類型A
的對象,它引用的對象與i
相同,但是將其轉換為(A)
。
因此,當我們調用a.doit(1.0)
,編譯器將查看a
具有的類型,並檢查是否有一個名為doIt
的方法,該方法將double作為輸入。 所以我的猜測是應該打印出"doIt A"
,但是我錯了。 它打印出"doIt C"
。 我想念什么? 我確實嘗試過使用Google,但是我發現向下轉換/向上轉換的整個主題都使atm感到困惑。
IX i = new C();
創建一個新的C實例,並為其分配靜態類型IX-合法,因為C 是 IX。
A a = (A) i;
創建引用A並將其分配給靜態類型A。編譯時和運行時安全。 我們知道A是C的父類。
a.doIt(1.0);
調度對對象a的方法調用,然后調用方法A :: doIt(double)。
實際(動態)類型C覆蓋了此方法。因此應打印“ doIt C”。
如果我錯了,請糾正我,但是會強制轉換,例如Bar b = new Bar(); Foo a = Foo(b),其中Bar擴展Foo。 Foo有方法擺動,bar有重寫方法擺動和新方法擺動。 然后b不能擺動,但可以擺動。 它將運行Bar版本的擺動。 因此,基本上,這僅意味着您只能運行Foo擁有的方法。 不是酒吧所擁有的方法。 但是,被Bar覆蓋的Foo具有的方法(例如擺動)將通過Bar版本運行。 該界面應該使您絆倒。 因此,在一個代碼示例中:
abstract class Foo{
public void wobble() {
//code A
}
}
class Bar extends Foo{
//overridden
public void wobble() {
//code B
}
public void wibble() {
//some other code C
}
}
public class Test {
public static void main(String[] args) {
Bar b = new Bar();
b.wobble(); //runs code B
b.wibble(); //runs code C
Foo f = (Foo)b;
f.wobble(); //runs code B
f.wibble(); //doesn't compile
Foo foo2 = new Foo(); //trick cannot instantiate abstract class
foo2.wobble(); //runs code A (if instantiated which it cant be)
foo2.wibble(); //will not compile because Foo does not have the wibble method
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.