2013-06-26 11 views
7

Powiedzmy, że mamy klasę:struktura logiczna/szczegóły zmiennej referencyjnej i obiektu w pamięci?

class Class1 
{ 
    int i = 1; 
} 

i mamy zmienną:

Class1 ob1 = new Class1(); 
  • Czy odwołanie sama przechowywaną w zmiennej ob1 przechowywać informacje, że odnosi się do obiektu Class1?
  • Czy część sterty, w której znajduje się Class1, zapisuje informację, że jest to typ Class1?
  • Jak logicznie wygląda ta informacja? Jest to ciąg taki jak application1.Class1 lub odniesienie do puli typów referencji?

Jeśli możesz polecić źródło takich informacji, będę bardzo wdzięczny za dostarczenie go, nie mogę go znaleźć w książce referencyjnej.

Odpowiedz

1

Czy sama referencja przechowywana w zmiennej ob1 przechowuje informację , która odnosi się do obiektu klasy 1?

NO. Zmienna odniesienia ob1 przechowuje tylko odniesienie do obiektu, na który wskazuje. Informacje o tym obiekcie są już znane aplikacji (lub JVM).

Czy część sterty, w której przechowywana jest klasa 1, przechowuje informację o tym, że jest to typ klasy 1?

NO. Informacje o ładowanej klasie są przechowywane w method area.Jak określono w this link
Dla każdego typu ładuje, maszyna wirtualna Java muszą przechowywać następujące rodzaje informacji w obszarze Metoda:

  • W pełni kwalifikowana nazwa typu
  • pełną nazwę bezpośredniej nadklasy typu (o ile typ nie jest interfejsem lub klasą java.lang.Object, z których żadna nie ma nadklasy)
  • Niezależnie od tego, czy typ jest klasą czy interfejsem
  • Modyfikatory typu (niektóre podzestawy) z " publicznego, streszczenie, końcowy)
  • Uporządkowana lista w pełni kwalifikowanych nazw jakichkolwiek bezpośrednich superinterfaces

Jak wygląda logicznie tych informacji? Jest to ciąg taki jak application1.Class1 lub odniesienie do puli typów referencji?

Wewnątrz pliku klasy Java i maszyny wirtualnej Java, nazwy typu są zawsze zapisywane jako pełni kwalifikowanych nazw. Na przykład pełna nazwa klasy Object w pakiecie java.lang jest reprezentowana jako java/lang/Object. W obszarze metody pełne nazwy mogą być reprezentowane w dowolnej formie i strukturach danych wybranych przez projektanta.

1

Każde odwołanie do obiektu java zna jego klasę w czasie wykonywania; Ten tak zwany „run-time informacji typu” jest używany w kodzie tak:

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

Można także uzyskać dostęp do klasy obiektu poprzez obj.getClass(). To zwróci class1.class, obiekt klasy Class<class1>. Zobacz metodę Object.getClass.

(Zauważ, że jeśli klasa jest parametryzowane, jak class1<T>, rodzaj T będzie nie być przechowywane w czasie wykonywania, ze względu na „wymazania”).

nie wiem, czy informacje klasa przechowywane za pomocą wskaźnika lub danych; jest to prawdopodobnie specyficzne dla implementacji w jvm; ale praktycznie nie ma to znaczenia z praktycznego punktu widzenia. (Więc albo odpowiedź 1 albo 2, albo obie, jest "tak").

Odpowiedź na 3 jest taka, że ​​w odniesieniu do programisty java informacja o typie działania jest umieszczona w obiekcie klasy Class. Pod pokrywami maszyna JVM może implementować to w taki czy inny sposób.

0

enter image description here

Jest to jeden z systemem, w którym JVM może przechowywać informacje o klasie do kontroli w czasie wykonywania przy użyciu instanceOf.

Każda maszyna wirtualna Java musi mieć możliwość określenia informacji o jej klasie, biorąc pod uwagę jedynie odniesienie do obiektu. Jest to potrzebne z wielu powodów, w tym odlewania bezpiecznego dla typu i operatora instanceof.

Jest to jeden ze sposobów, w których wdrożenie maszyny wirtualnej Java mógł współpracownik informacja klasa z danymi do instancji obiektu. W postaci ta liczba, natywny wskaźnik do struktury danych zawierającej informacje klasy jest przechowywany wraz ze zmiennymi instancji dla obiektu. Szczegóły, w których różne sposoby JVM może połączyć dane obiektu z informacjami o klasie są poza zakresem tego artykułu. Ważne jest, aby zrozumieć, że informacje o klasie będą w pewien sposób powiązane z danymi o instancjach obiektów, oraz że dane instancji zawierają pola dla klasy obiektu i wszystkich jej nadklas ( ).

Artima post on Object initialization

Więc kiedy zrobić instanceOf sprawdzić informacje o klasie jest dostępna za pośrednictwem tego wskaźnika. Ale ponownie należy pamiętać, że dokładna implementacja dotycząca przechowywania informacji o klasie może być specyficzna dla implementacji.

1

odpowiadając na pytanie:

  1. Nie, to nie. Odniesienie jest jedynie odniesieniem, tj. Pewnym adresem w sterty, gdzie przechowywany jest odpowiedni obiekt. Nie ma potrzeby przechowywania zduplikowanych informacji o typie odniesienia w samym odnośniku, ponieważ faktycznie zmienna rzeczywista, która zawiera jego adres odniesienia, może mieć różne typy klas.

  2. Bardzo dziwne pytanie. Oczywiście, tak, robi to. Ponadto ta "część sterty" jest obiektem, który zawiera ten szczególny opis klasy. Każdy obiekt Class zawiera informacje o pełnej nazwie tej klasy, która jest przez nią opisywana.

  3. To nie jest zdefiniowane jako jak to wygląda logicznie, jeśli masz na myśli swoją strukturę:

2.7 Representation of Objects:

maszyna wirtualna Java nie określa żadnej szczególnej wewnętrznej strukturę obiektów.

Ale jeśli mówimy o informacje na temat klasy typu - tak, to jest po prostu String obiektu, ponieważ „typ” z Class obiektu (którego jest reprezentują) to tylko nazwa odpowiedniej klasy.

+0

1. Nie, nie ma. ale odpowiedź brzmi: "Każda maszyna wirtualna Java musi mieć możliwość ustalenia informacji o jej klasie, biorąc pod uwagę jedynie odniesienie do obiektu." – MaxNevermind

+0

@MaxNevermind Nie widzę, gdzie? Nie mylisz się z terminami "referencje" i "dane obiektowe"? Używając referencji może po prostu spojrzeć na obiekt i ustalić, która to klasa. – Andremoniy

Powiązane problemy