Wann ist der richtige Zeitpunkt, um das Schlüsselwort "new" zu verwenden?

8

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:

%Vor%

Manchmal im Code merke ich, dass new nicht benutzt wird und ich verwirrt bin .. In dieser Codezeile:

%Vor%

Warum wird keine Instanz des AssetManagers wie folgt erstellt:

%Vor%

dann ist es gleich getAsests ()?

gesetzt

Wann sollte new verwendet werden?

Danke!

    
foobar5512 06.01.2012, 22:32
quelle

8 Antworten

9

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"

    
AedonEtLIRA 06.01.2012, 22:35
quelle
5

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.

    
zeller 06.01.2012 22:38
quelle
3

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:

%Vor%

und Sie können auch Reflexion verwenden:

%Vor%     
czajah 06.01.2012 22:40
quelle
2

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.

    
PearsonArtPhoto 06.01.2012 22:36
quelle
2

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.

    
Philipp Wendt 06.01.2012 22:36
quelle
2

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.

    
Argyle 06.01.2012 22:36
quelle
1

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 zu einem Objekt.

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:

%Vor%

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.

>     
Ilmari Karonen 29.10.2017 18:05
quelle
0

Beachten Sie den Großbuchstaben in TextView und das Fehlen von es in GetAssets. getAssets ist keine Klasse wie TextView, es ist eine Methode, die ein Objekt zurückgibt. Und wie viele andere bereits erwähnt, ist Ihr Asset bereits vorhanden.

    
keyser 06.01.2012 22:37
quelle

Tags und Links