在Java中,Object
可以具有運行時類型(它是創建時的類型)和流式類型(您已將其轉換爲類型)。Java術語說明
我想知道正確這些類型的名稱是什麼。例如
class A {
}
class B extends A {
}
A a = new B();
一個被作爲B
創建但是它被宣佈爲A
。使用每個視角來指稱a
的類型的正確方法是什麼?
在Java中,Object
可以具有運行時類型(它是創建時的類型)和流式類型(您已將其轉換爲類型)。Java術語說明
我想知道正確這些類型的名稱是什麼。例如
class A {
}
class B extends A {
}
A a = new B();
一個被作爲B
創建但是它被宣佈爲A
。使用每個視角來指稱a
的類型的正確方法是什麼?
我認爲對象區分是很重要的(它存在在執行時,只是具有其執行時間型)和一個表達(諸如可變),其具有一個編譯時間類型。
因此,在這種情況下:
A a = new B();
a
是A
類型的變量。它在執行時的值是對B
類型的對象的引用。
Java語言規範使用「運行時間類」(例如,用於覆蓋的目的,如section 15.12.4.4),用於對象的類型。在其他地方,我認爲它只是使用「type」作爲表達式的類型,這意味着編譯時類型。
我會說你區分變量/引用的類型和對象的類型。在這種情況下
A a = new B();
可變/參考將類型A
但B
類型的對象的。
變量a
的類型是A
。沒有改變,因爲它是一個參考。它恰巧指的是B
類型的對象。當您通過A
參考引用B
對象時,您只能將它看作是A
類型的對象。
以後,您可以將它轉換爲它的更具體的類型
B b = (B)a;
,並使用該對象的B
方法。
在這種情況下,A
是參考類型而B
是實例類型
Java語言規範談到變量的聲明類型,的getClass()
有關對象的運行時類的Javadoc。
請注意,在Java中不存在運行時類型; List<String>
和List<Integer>
是不同的類型,但它們的實例共享相同的運行時類。
您正在尋找的術語是表觀類型和實際類型。
A a = new B();
的表觀類型是A,因爲編譯器只知道該對象的類型是A.作爲這樣的在這時候可以不引用任何的B特異性的方法。
實際類型是B.您可以轉換對象(即更改其明顯類型)以訪問B特定的方法。
我以前沒有聽說過「明顯類型」的術語。你能告訴我你從哪裏得到的?我不認爲我在JLS中看到過它。 – 2009-10-03 17:26:24
Michael J. Laszlo - 以Java中的圖形應用程序爲特色的面向對象編程使用這些術語來描述問題中提到的類型差異。事情是,我認爲每個作者都必須爲其他地方沒有明確定義的這樣的東西做出自己的術語。 – 2009-10-03 21:08:11
要確定a
是類的對象,你可以使用:List類型
/*The java.lang.Object.getClass() method returns the runtime class of an object*/
System.out.println("a is object of: "+a.getClass());
這是如何回答這個問題的? – shmosel 2018-01-11 03:53:56
該op是想知道什麼是可以用於'a'的術語。我的意思是說'a'是類'b'的一個對象。 – 2018-01-11 03:59:29
呼叫getGenericType(),你就會得到它指的是List類和一個ParameterizedType對象字符串類型參數。 – 2009-10-03 21:42:43
是的。這反映了該領域的公認類型,因此與我的答案不矛盾。 – meriton 2009-10-14 22:03:18