2017-08-04 105 views
4

我有一個引用變量的問題。我的問題是,聲明變量的類型是指對象的類型還是存儲在其中的引用的類型?引用變量的數據類型(Java)

我發現了Edwin Dalorzo在 this話題中的一個非常有趣的答案。他描述了每個引用都有一個類型,當我們執行一個類型轉換時,它只會改變引用該對象的引用的類型(而不是該對象本身的類型!)。

所以我的問題是,引用變量的類型是否告訴我們存儲了哪種類型的引用。當然,對象的類型和引用的類型是相同的。

假設B a = new B();

不B現在告訴大家,一個擁有B型的引用,編譯器?

或者編譯器是否完全忽略存儲在其中的數據類型(引用),並且只考慮底層對象的類型?方法返回類型相同。

回答

4

基準有一個類型,並且它可以僅具有一個參考分配給它的對象,它是該類型的一個實例(或子類或實現類)

編譯器和JVM都檢查對象的引用和類型。

在某些情況下,只有一個比如

Thread t = null; 
t.yield(); 

在這種情況下,調用靜態方法,並且不考慮參考的實際值。相反,當使用反射時,其中參考的類型並不重要,只有底層對象。

2

當編譯器看到這一行:

B a = new B(); 

它將 「只是」 知道下面的東西算賬:

  • 一個是
  • 一個具有 「至少」 B型

喜歡在:

Object o = "hello"; 

的編譯器後知道的是O實際上是一個字符串,而不是「剛」的對象。理論上,編譯器也可以「記住」附加部分(在某種程度上,例如在方法範圍內)。但是,對於這種「複雜」的數據流考慮,javac,字節碼編譯器java非常保守。

請記住:「性能」的Java方法是強調通過JIT編譯器優化運行時。從這個意義上說,在編譯時間擴展分析(不包括類型推斷)方面花費了大量的努力並不值得「值得」。