Wann muss das Schlüsselwort new
in Java verwendet werden? Ich weiß, dass Sie es verwenden sollten, wenn Sie eine Instanz eines Objekts wie folgt erstellen:
Manchmal im Code merke ich, dass new
nicht benutzt wird und ich verwirrt bin ..
In dieser Codezeile:
Warum wird keine Instanz des AssetManagers wie folgt erstellt:
%Vor%dann ist es gleich getAsests ()?
gesetzt Wann sollte new
verwendet werden?
Danke!
Sie verwenden das neue Schlüsselwort, wenn ein Objekt zum ersten Mal explizit erstellt wird. Das Abrufen eines Objekts mit einer Getter-Methode new ist nicht erforderlich, da das Objekt bereits im Speicher vorhanden ist und daher nicht neu erstellt werden muss.
Wenn Sie eine detailliertere Beschreibung des neuen Besuchs wünschen die Oracle-Dokumente
Ein Objekt benötigt das Schlüsselwort 'new', wenn es null ist (was für nicht initialisiert ist).
BEARBEITEN:
Dadurch wird unter den aktuellen Umständen immer "benötigt neu" gedruckt.
%Vor%Um es zu beheben, würden Sie etwas tun wie:
%Vor%Und unter diesen Umständen werden wir immer sehen, "braucht nicht neu"
In Java müssen Sie immer new
verwenden, um Objekte zu instanziieren (naja, fast immer). Mit getAssests()
rufen Sie einen bereits erstellten ab. Ich nehme an, Ihre Frage kommt von C ++, wo new
dynamischen Speicher zuweist, aber da Java nur dynamische Objekte hat, wird immer neues benötigt.
new
wird immer verwendet, um ein neues Objekt zu erstellen.
das
%Vor% ist nur die Zuweisung eines Wertes, der von der Methode getAssets()
an die Referenz assetManager
zurückgegeben wird.
[Bearbeiten]
Ich habe über new
gelogen, es ist möglich, so etwas zu tun:
und Sie können auch Reflexion verwenden:
%Vor%Das neue wird verwendet, wenn Sie den Konstruktor für eine Funktion aufrufen. getAssets () gibt einen AssetManager zurück, den es nicht benötigt um ein neues zu erstellen.
Wenn Sie new
verwenden, weisen Sie Speicher für das Objekt zu.
Die Verwendung von getXXX()
wird verwendet, um ein vorhandenes Objekt abzurufen, das bereits zugewiesen ist.
Da du dies mit [android] gekennzeichnet hast, vermute ich, dass dein Code innerhalb von Activity
oder Service
liegt. In diesem Fall ist getAssets()
eine Methode der Klasse, die Sie erweitern. Damit Sie es nicht wirklich erstellen, fragen Sie den vorhandenen Code, Ihnen einen Verweis darauf zu geben, was bereits existiert.
In Java erstellt new MyClass()
eine neue Instanz von MyClass
und gibt einen Verweis darauf zurück.
Inzwischen die Erklärung:
%Vor% definiert eine Variable foo
, die eine Referenz auf eine Instanz von MyClass
speichern kann, oder den speziellen Wert null
, der angibt, dass eine solche Referenz fehlt. Wenn Sie keinen Verweis auf foo
angeben, ist der Standardwert null
.
Sie können diese Dinge sicherlich kombinieren, z. so:
%Vor%oder, äquivalent, wie folgt:
%Vor%Aber Sie haben nicht, jedes Mal, wenn Sie einer Referenzvariablen etwas zuweisen, eine neue Instanz zu erstellen. Sie könnten genauso gut z.B. das:
%Vor%oder sogar:
%Vor% Beachten Sie, dass Sie in Java im Gegensatz zu einigen anderen Sprachen wie C ++ niemals eine Kopie eines tatsächlichen Objekts einer Variablen zuweisen können. Vielmehr wird auf Java-Objekte immer über Referenzen zugegriffen. Wenn jemand von "Zuweisung eines Objekts zu einer Variablen" oder "Übergabe eines Objekts als Parameter" oder "Rückgabe eines Objekts von einer Methode" in Java spricht, ist immer die Zuweisung oder Weitergabe einer Referenz
Methoden, die Ihr Code aufruft, können auch Verweise auf Objekte zurückgeben (und tun dies auch oft). Zum Beispiel, wenn Ihre Klasse eine Methode wie diese hatte:
%Vor%Sie könnten es aufrufen und die Referenz speichern, die es in eine Variable wie folgt zurückgibt:
%Vor%oder wie folgt:
%Vor% Wir können anhand der Methodendeklaration feststellen, dass getSomeObject()
immer einen Verweis auf eine MyClass
-Instanz (oder null
) zurückgibt, aber nicht dort, wo diese Instanz tatsächlich herkommt. Das hängt ganz davon ab, was der Code in der getSomeObject()
-Methode tut. Der Code kann bei jedem Aufruf immer eine neue MyClass
-Instanz mit new MyClass()
erstellen und einen Verweis darauf zurückgeben, oder er kann immer einen Verweis auf das gleiche -Objekt zurückgeben. Oder, natürlich, könnte es manchmal einen Verweis auf ein neues Objekt zurückgeben und manchmal auf einen zuvor erstellten.
Beachten Sie, dass, wenn Sie einer Variablen einen neuen Wert zuweisen, die zuvor enthaltene Variable vergessen wird. Wenn der vergessene Wert die letzte Referenz auf ein Objekt ist, wird dieses Objekt selbst von Java's Garbage Collector zerstört.
So zum Beispiel, während es möglich ist, so etwas zu tun:
%Vor% das macht normalerweise keinen Sinn, da Sie eine neue MyClass
-Instanz erstellen würden, nur um dann Ihre einzige Referenz darauf wegzuwerfen und sie durch etwas anderes zu ersetzen. In der Tat entspricht der obige Code genau dem:
Der einzige Zeitpunkt, der sogar im Entferntesten Sinn ergeben könnte, wäre, wenn Sie wollten eine neue MyClass
-Instanz erstellen und sie sofort als Garbage Collected erfassen lassen, z. weil der Konstruktor MyClass
einige Nebeneffekte hatte, die Sie auslösen wollten. Aber da es für Konstruktoren normalerweise als schlechter Stil angesehen wird, irgendwelche nicht-trivialen Nebenwirkungen zu haben (oder, allgemeiner, etwas anderes zu tun, als das neue Objekt einzurichten), sollte man normalerweise keine Entschuldigung dafür haben, solchen Code zu schreiben.
Tags und Links java new-operator object