簡體   English   中英

(初學者Java)向下轉換/向上轉換/接口

[英](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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM