2013-06-26 8 views
7

Diciamo che abbiamo una classe:struttura logica/dettagli di una variabile di riferimento e oggetto in memoria?

class Class1 
{ 
    int i = 1; 
} 

e noi abbiamo una variabile:

Class1 ob1 = new Class1(); 
  • Does un punto di riferimento per sé memorizzato in un ob1 negozio variabile l'informazione che si riferisce ad un oggetto di Class1?
  • La parte dell'heap in cui è memorizzato Class1 memorizza le informazioni sul tipo Class1?
  • Come sembra logicamente questa informazione? È una stringa come application1.Class1 o un riferimento ad alcuni pool di tipi di riferimento?

Se si può consigliare la fonte di tali informazioni, sarò molto grato per averlo fornito. Non riesco a trovarlo nel libro di consultazione.

risposta

1

Un riferimento memorizzato in una variabile ob1 memorizza le informazioni che fa riferimento a un oggetto di Classe1?

NO. La variabile di riferimento ob1 memorizza solo il riferimento dell'oggetto a cui punta. E le informazioni su quell'oggetto sono già note all'applicazione (o JVM).

La parte dell'heap in cui è memorizzato Class1 memorizza le informazioni di tipo Classe1?

NO. Le informazioni sulla classe caricata sono memorizzate in method area.Come specificato nel this link
Per ogni tipo di carica, una macchina virtuale Java deve memorizzare i seguenti tipi di informazioni nella zona di metodo:

  • Il nome completo del tipo
  • Il nome completo della superclasse diretta del tipo (a meno che il tipo è un interfaccia o di classe java.lang.Object, nessuno dei quali ha una superclasse)
  • o meno il tipo è una classe o un'interfaccia
  • modificatori del tipo (un sottoinsieme di` pubblico, astratto, finale)
  • Un elenco dei nomi completi di eventuali superinterfacce diretti

Come funziona logicamente sembra che questa informazione ha ordinato? È una stringa come application1.Class1 o un riferimento ad alcuni pool di tipi di riferimento?

All'interno del file di classe Java e Java virtual machine, i nomi dei tipi sono sempre memorizzati come nomi completi. Ad esempio, il nome completo della classe Object nel pacchetto java.lang viene rappresentato come java/lang/Object. Nell'area del metodo, i nomi completi possono essere rappresentati in qualsiasi forma e struttura di dati che un designer sceglie.

1

Ogni riferimento a oggetti java conosce la sua classe in fase di esecuzione; questo cosiddetto "run-time le informazioni di tipo" viene utilizzato in codice come questo:

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

è anche possibile accedere alla classe di un oggetto attraverso obj.getClass(). Ciò restituirà class1.class, un oggetto della classe Class<class1>. Vedi il metodo Object.getClass.

(Si noti che se la classe è parametrizzato, come class1<T>, il tipo di T sarà non essere conservato in fase di esecuzione, a causa di "cancellazione".)

Non so se le informazioni classe è memorizzato con il puntatore o con i dati; è probabilmente specifico per l'implementazione in jvm; ma non ha importanza dal punto di vista pratico. (Quindi, rispondere 1 o 2, o entrambi, è "sì").

La risposta a 3 è che, per quanto riguarda un programmatore java, le informazioni sul tipo di esecuzione sono incapsulate in un oggetto della classe Class. Sotto le copertine, una JVM può implementarla in un modo o nell'altro.

0

enter image description here

Questo è uno del regime in cui la JVM in grado di memorizzare le informazioni della classe per il controllo in fase di esecuzione utilizzando instanceOf.

Ogni macchina virtuale Java deve avere la capacità di determinare le informazioni sulla sua classe, dato solo un riferimento a un oggetto. Questo è necessario per molte ragioni, tra cui il cast sicuro per tipo e l'operatore instanceof.

Questo è un modo in cui un'implementazione Java virtual machine potrebbe informazioni di classe associato con i dati di istanza di un oggetto. In questa figura, un puntatore nativo a una struttura dati contenente le informazioni della classe viene memorizzato insieme alle variabili di istanza per un oggetto. I dettagli in cui i vari modi in cui una JVM può collegare i dati di un oggetto con le informazioni sulla classe esulano dallo scopo di questo articolo. La cosa importante da capire qui è che le informazioni di classe saranno associate in qualche modo ai dati di istanza degli oggetti e che i dati di istanza includono campi per la classe di un oggetto e tutte le sue superclassi .

Artima post on Object initialization

Quindi, quando si fa instanceOf controllo le informazioni sulla classe si accede tramite questo puntatore. Ma ancora una volta tieni presente che l'esatta implementazione della memorizzazione delle informazioni sulla classe può essere specifica dell'implementazione.

1

rispondere alla tua domanda:

  1. No, non è così. Il riferimento è solo un riferimento, ad esempio un indirizzo in heap, in cui è memorizzato l'oggetto corrispondente. Non è necessario memorizzare informazioni duplicate sul tipo di riferimento nel riferimento stesso, perché la variabile reale, che contiene il suo indirizzo di riferimento, potrebbe essere di vari tipi di classe.

  2. Domanda molto strana. Naturalmente, sì, lo fa. Inoltre, questa "parte di heap" è un oggetto, che contiene questa particolare descrizione di classe. Qualsiasi oggetto Class contiene informazioni su nome completo di tale classe, che è descritto da esso.

  3. Non è definito come come appare logico, se si intende la sua struttura:

2.7 Representation of Objects:

La macchina virtuale Java non impone alcuna particolare struttura interna per gli oggetti.

Ma se stiamo parlando di informazioni sul tipo di classe - sì, è solo un oggetto String, perché "tipo" di Class oggetto (che è rappresentare) è solo un nome di classe corrispondente.

+0

1. No, non è così. ma la risposta qui sotto dice "Ogni macchina virtuale Java deve avere la capacità di determinare le informazioni sulla sua classe, dato solo un riferimento a un oggetto." – MaxNevermind

+0

@MaxNevermind Non vedo, dove? Non ti confondi con i termini "riferimento" e "dati oggetto"? Usando il riferimento potrebbe semplicemente guardare l'oggetto e determinare di quale classe si tratta. – Andremoniy

Problemi correlati