2013-06-26 25 views
7

比方說,我們有一個類:邏輯結構/內存中引用變量和對象的詳細信息?

class Class1 
{ 
    int i = 1; 
} 

,我們有一個變量:

Class1 ob1 = new Class1(); 
  • 是否本身存儲在一個變量ob1商店,它指的是物體的信息的參考Class1
  • Class1存儲堆的部分是否存儲它是Class1類型的信息?
  • 在邏輯上如何看起來像這樣的信息?它是一個像application1.Class1的字符串或對某些引用類型池的引用?

如果您可以推薦這些信息的來源,我將非常感激提供它,我無法在參考書中找到它。

回答

1

參考本身存儲在變量ob1中是否存儲信息 它指的是Class1的對象?

NO。參考變量ob1只存儲它指向的對象的引用。並且有關該對象的信息已爲應用程序(或JVM)所知。

存儲Class1的堆的部分是否存儲了它是Class1類型的信息 ?

NO。有關正在加載的課程的信息存儲在method area中。作爲this link
指定它加載每個類型,Java虛擬機必須存儲以下類型的信息在方法區:

  • 類型
  • 的全名的全名類型的直接超類(除非類型是接口或類java.lang.Object,它們都沒有超類)
  • 類型是類還是接口
  • 類型的修飾符(某些子集of`公共的,抽象的,最終的)
  • 有序任何直接超級

如何在邏輯上是這樣的信息的完全合格的名單?這是一個字符串,如 application1.Class1或對某些引用類型池的引用?

在Java類文件和Java虛擬機中,類型名稱始終存儲爲完全限定名稱。例如,包java.lang中的Object類的完全限定名稱表示爲java/lang/Object在方法區域中,可以使用設計人員選擇的任何形式和數據結構來表示完全限定名稱。

1

每個java對象引用在運行時都知道它的類;這個所謂的「運行時類型信息」中的代碼這樣使用:

if (obj instanceof class1) { 
    // true! 
} 

您也可以通過obj.getClass()訪問類的一個對象。這將返回class1.class,這是類Class<class1>的一個對象。請參閱Object.getClass方法。

(請注意,如果你的類是參數,爲class1<T>T類型將存儲在運行時,由於「刪除」。)

我不知道該類信息是否與指針或數據一起存儲;它可能在jvm中是特定於實現的;但從實際角度來看,這並不重要。 (所以答案1或2,或者兩者都是「是」)。

對於3的答案是,就Java程序員而言,運行時類型信息被封裝在類Class的對象中。在封面之下,JVM可以以這種或那種方式實現這一點。

0

enter image description here

這是其中JVM可以存儲類的信息使用instanceOf在運行時檢查該方案中的一個。

每個Java虛擬機都必須具有確定其類的信息的能力,只給出對象的引用。這是由於許多原因而需要的,包括類型安全的轉換和instanceof操作符。

這是Java虛擬機實現可以將類信息與對象的實例數據相關聯的一種方式。在 這個數字中,指向包含類 信息的數據結構的本地指針與對象的實例變量一起存儲。 JVM可以將對象的 數據與其類信息連接起來的各種方式的細節超出了本文的範圍。 這裏要理解的重要一點是,類信息 在某種程度上與對象的實例數據相關聯,並且該實例數據包括對象類的字段及其所有的超類。

Artima post on Object initialization

所以,當你做instanceOf檢查有關類的信息通過該指針訪問。但是請記住,關於類信息存儲的確切實現可能是特定於實現的。

1

回答你的問題:

  1. 不,它不。引用只是一個引用,即堆中的某個地址,其中存儲了相應的對象。沒有必要在引用本身中存儲關於引用類型的重複信息,因爲實際上包含引用地址的實變量可以是不同的類類型。

  2. 很奇怪的問題。當然,是的,它確實是。而且,這個「堆的一部分」是一個包含這個特定類描述的對象。任何Class對象包含有關全名的信息,該信息由其描述。

  3. 它沒有被定義爲它的外觀在邏輯上,如果你的意思是它的結構:

2.7 Representation of Objects:

Java虛擬機不要求任何特定的內部 結構對象。

但是,如果我們談論的是有關類類型 - 是的,它只是一個String對象,因爲Class對象(它是代表)的「型」僅僅是一個對應的類的名稱。

+0

1.不,它不。嗯,但答案咆哮說:「每個Java虛擬機必須有能力確定有關它的類的信息,只給予一個對象的引用。」 – MaxNevermind

+0

@MaxNevermind我沒看到,在哪裏?你不覺得與術語「參考」和「對象數據」混淆嗎?使用引用可以簡單地查看對象並確定它是哪個類。 – Andremoniy