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