2016-08-20 3 views
17
RealEstate v = new RealEstate(); 

Ich habe dieses new Schlüsselwort mit RealEstate() verwendet. Ich weiß new reserviert Speicher und initialisiert den Speicher mit dem Klassenkonstruktor RealEstate.Was macht die JVM, wenn der 'neue' Operator den Speicher mit Hilfe des Konstruktors initialisiert?

Was macht die JVM hier?

+6

Ich habe nicht das Gefühl, dass diese Frage 6 Downvotes haben sollte, wahrscheinlich haben Downvoters nicht verstanden, was das OP wirklich gefragt hat. Hoffentlich kämpften 6 User gegen die Downvotes. –

+0

yep genau @ Jean-FrançoisSavard –

+0

Ihre Frage enthält eine eigene Antwort. Unklar, was du verlangst. – EJP

Antwort

13

new Der Operator verwendet nicht die Hilfe vom Konstruktor, um Speicher zuzuordnen. Es hat nichts mit Konstrukteur zu tun. Basically Java's version of malloc is new.

new Betreiber:

  • weist Speicher für ein Objekt
  • Invokes Konstruktor Objekt
  • kehrt Verweis auf diesen Speicher

Constructor separat ausgeführt wird, um alle Operationen während der Initialisierung durchzuführen, wie das Zuordnen von Werten zu Objekten und Variablen. Wenn kein Konstruktor definiert ist, dann wird Compiler Standardkonstruktors erstellen und Standardwerte zuweisen:


Die folgende Tabelle fasst die Standardwerte für verschiedene Datentypen. source

Data Type Default Value (for fields) 
byte   0 
short   0 
int    0 
long   0L 
float   0.0f 
double   0.0d 
char   '\u0000' 
String   null 
any object  null 
boolean   false 

So ordnet new Operator nur Speicher und kehrt in dieser Speicherreferenz.

Siehe documentation:

Der neue Operator instanziiert eine Klasse von Speicher für ein neues Objekt Zuweisung und einen Verweis auf diesen Speicher zurückkehrt. Der neue Operator ruft auch den Objektkonstruktor auf.

+8

Nein, Java verwendet kein malloc für jedes Objekt. Es ist tatsächlich viel weniger Overhead, indem im Grunde ein Zeiger in einer Region namens TLAB (thread local allocation buffer) inkrementiert wird. Was als nächstes passiert, wird in der Java-Sprachspezifikation angegeben. Dazu gehören das Ausführen von Initialisierern und Konstruktoren der Klassenhierarchie. Und vor allem ist die eigentliche Klasse für das Objekt konstruiert und initialisiert. https://docs.oracle.com/javase/specs/jls/se7/html/jls-12.html#jls-12.5 – eckes

+1

Es reserviert Speicher * zuerst *, ruft dann den Konstruktor auf und gibt den Verweis zurück. Der Standardkonstruktor wird vom Compiler und nicht von der JVM erstellt. Sie haben die Standardwerte für Integer-Felder weggelassen, und Sie müssen keinen Standardwert für "String" angeben, bei dem es sich lediglich um ein anderes Objekt handelt. Die zitierte Aussage stammt aus dem Java-Tutorial, nicht 'die Dokumentation'. Die korrekte Angabe ist die Java-Sprachspezifikation. – EJP

+0

@EJP Ich wollte nur auf die wichtigsten Operationen hinweisen, die während der Initialisierung ausgeführt werden. Das sollte nicht die genaue Reihenfolge sein, in der sie ausgeführt werden. Wie auch immer, danke für die Benachrichtigung, ich habe meine Antwort entsprechend aktualisiert. Soweit es die * Standardwerte Chart Zusammenfassung * betrifft, weiß sie, dass es keine richtige Dokumentation ist, aber schließlich ist es immer noch von [Oracle] (http://docs.oracle.com/javase/tutorial/java /nutsandbolts/datatypes.html). Ich denke, man kann ihm vertrauen. –