In Java, new MyClass()
erstellt eine neue Instanz von MyClass
und gibt einen Verweis auf sie zurück.
Inzwischen ist die Erklärung:
MyClass foo;
definiert eine Variable foo
die einen Verweis auf eine Instanz von MyClass
oder den besonderen Wert null
die auf das Fehlen eines solchen Hinweises hinweist. Wenn Sie keinen Hinweis auf foo
ist der Standardwert null
.
Sie können diese Dinge durchaus kombinieren, z. B. so:
MyClass foo; // define a variable foo that can store an object reference
foo = new MyClass(); // create a new object and assign a reference to it to foo
oder, äquivalent dazu, wie folgt:
MyClass foo = new MyClass(); // combined variable definition and assignment
Aber das tun Sie nicht haben um jedes Mal, wenn Sie einer Referenzvariablen etwas zuweisen, eine neue Instanz zu erstellen. Sie könnten z. B. auch dies tun:
MyClass foo, bar; // define two reference variables, foo and bar
foo = new MyClass(); // create a new object and assign a reference to it to foo
bar = foo; // now foo and bar point to the same object
oder sogar:
MyClass foo = new MyClass(), bar = foo; // same, but shorter
Beachten Sie, dass Sie in Java, im Gegensatz zu einigen anderen Sprachen wie C++, niemals ein tatsächliches Objekt (eine Kopie) einer Variablen zuweisen können. Vielmehr wird auf Java-Objekte immer über Referenzen auf sie zugegriffen. Wenn jemand in Java davon spricht, "ein Objekt einer Variablen zuzuweisen" oder "ein Objekt als Parameter zu übergeben" oder "ein Objekt aus einer Methode zurückzugeben", meint er eigentlich immer die Zuweisung oder Übergabe oder Rückgabe eines Referenz zu einem Objekt.
Methoden, die Ihr Code aufruft, können (und tun es oft) auch Verweise auf Objekte zurückgeben. Wenn Ihre Klasse zum Beispiel eine Methode wie diese hätte:
private MyClass getSomeObject() {
// ...some code here...
}
aufrufen und den zurückgegebenen Verweis in einer Variablen wie dieser speichern:
MyClass foo;
foo = getSomeObject();
oder so:
MyClass foo = getSomeObject();
Aus der Methodendeklaration geht hervor, dass getSomeObject()
gibt immer einen Verweis auf eine MyClass
Instanz (oder null
), aber nicht, woher diese Instanz tatsächlich kommt. Das hängt ganz davon ab, was der Code innerhalb der getSomeObject()
Methode tut. Der Code könnte immer eine neue MyClass
Instanz mit new MyClass()
jedes Mal, wenn es aufgerufen wird, einen Verweis darauf zurück, oder es könnte immer einen Verweis auf die dieselbe Objekt. Oder natürlich könnte es manchmal einen Verweis auf ein neues Objekt und manchmal auf ein zuvor erstelltes Objekt zurückgeben.
Beachten Sie, dass, wenn Sie einer Variablen einen neuen Wert zuweisen, alles, was die Variable vorher enthielt, vergessen wird. Wenn der vergessene Wert zufällig der letzte Verweis auf ein Objekt ist, dann wird dieses Objekt selbst vom Java Garbage Collector zerstört.
So ist es zum Beispiel sicherlich möglich um so etwas zu tun:
MyClass foo = new MyClass(); // create a new object and assign (a reference to) it to foo
foo = getSomeObject(); // forget the previous content of foo and replace it with whatever getSomeObject() returns
was normalerweise keinen Sinn macht, da Sie eine neue Datei erstellen würden. MyClass
So kann man zum Beispiel den einzigen Hinweis darauf sofort wegwerfen und durch etwas anderes ersetzen. In der Tat ist der obige Code genau äquivalent zu:
new MyClass(); // create a new object and throw away(!) the reference to it
MyClass foo = getSomeObject(); // assign whatever getSomeObject() returns to foo
Der einzige Fall, in dem das auch nur im Entferntesten Sinn machen könnte, wäre, wenn Sie gesucht um eine neue MyClass
Instanz und lassen Sie sie sofort abholen, z. B. weil die MyClass
Konstruktor hatte einen Nebeneffekt, den Sie auslösen wollten. Da es aber in der Regel als schlechter Stil gilt, wenn Konstruktoren irgendwelche nicht-trivialen Nebeneffekte haben (oder, allgemeiner, irgendetwas anderes tun als das neue Objekt einzurichten), sollten Sie normalerweise keine Ausrede haben, solchen Code zu schreiben.