簡體   English   中英

為什么Java對象類在轉換后保持不變?

[英]Why Java object class remains same after casting?

我試圖改造一個對象。 但是在運行時,對象類仍然是派生類。

Derived drv = new Derived();

Base base = (Base) drv;

System.out.println("Class : " + base.getClass()); 

//prints -> Class : class packagename.Derived

那么為什么類屬性沒有改變?

那么為什么類屬性沒有改變?

因為對象沒有改變,只是你所擁有的引用類型。 轉換對對象本身完全沒有影響。

在Java中,與其他語言(謝天謝地)不同,引用的類型在很大程度上不會影響您獲得的方法版本。 例如,考慮這兩個類(由2rs2ts提供 - 謝謝!):

class Base {
    public Base() {}
    public void foo() {
        System.out.println("I'm the base!");
    }
}

class Child extends Base {
    public Child() {}
    public void foo() {
        System.out.println("I'm the child!");
    }
}

這段代碼:

Child x = new Child();
Base y = (Base) x;
y.foo();

...輸出

I'm the child!

因為即使y的類型是Base ,我們調用foo對象也是Child ,因此調用Child#foo 在這里(再次由2rs2ts提供 )是一個關於ideone例子

盡管經過Base引用我們得到Child#foo的事實對於多態性是至關重要的。

現在,你正在調用的方法( getClass只能Object#getClass ,因為它是一個final方法(子類不能覆蓋它)。 但這個概念至關重要,我認為它可能是你所詢問的核心。

引用類型的主要作用是確定允許訪問的對象的哪些方面。 例如,假設我們向Child添加bar

class Child extends Base {
    public Child() {}
    public void foo() {
        System.out.println("I'm the child!");
    }
    public void bar() {
        System.out.println("I'm Child#bar");
    }
}

此代碼將無法編譯:

Child x = new Child();
Base y = (Base) x;
y.bar(); // <=== Compilation error

...因為Base沒有bar方法,所以我們無法通過類型為Base的引用訪問對象的bar方法。

您無法在Java中更改實例的類型。 您對演員表所做的一切都是從不同類型的變量中引用它。

向上轉換不會更改對象的類型。 事實上,NOTHING改變了Java對象的類型。

這是OO編程的核心:對象具有不受外界影響的已定義行為。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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