24 Stimmen

Wann ist der richtige Zeitpunkt für die Verwendung des Schlüsselworts "neu"?

Wann ist es notwendig, die new Schlüsselwort in Java. Ich weiß, dass Sie es verwenden sollten, wenn Sie eine Instanz eines Objekts wie dieses erstellen:

TextView textView = new TextView(this);

Manchmal stelle ich im Code fest, dass new wird nicht verwendet und ich bin verwirrt In dieser Zeile des Codes:

    AssetManager assetManager = getAssets();

Warum wird nicht eine Instanz des AssetManagers wie diese erstellt?

AssetManager assetManager = new AssetManager();

dann wird es gleich getAssests() gesetzt?

Wann sollte new verwendet werden?

Danke!

12voto

ahodder Punkte 11208

Sie verwenden das Schlüsselwort new, wenn ein Objekt zum ersten Mal explizit erstellt wird. Dann ist das Abrufen eines Objekts mit einer Getter-Methode new nicht erforderlich, da das Objekt bereits im Speicher vorhanden ist und daher nicht neu erstellt werden muss.

wenn Sie eine ausführlichere Beschreibung der neuen Website wünschen die Oracle-Dokumente

Ein Objekt benötigt das Schlüsselwort "new", wenn es null ist (was so viel wie "nicht initialisiert" bedeutet).

EDIT:

Unter den gegebenen Umständen wird immer "needs new" gedruckt.

Object mObj = null;
if (mObj == null)
    System.out.println("needs new");
else
    System.out.println("does NOT need new");

OUTPUTS: needs new

Um das Problem zu beheben, müssten Sie also etwas tun wie:

Object mObj = new Object();
if (mObj == null)
    System.out.println("needs new");
else
    System.out.println("does NOT need new");
OUTPUTS: does NOT need new

Und unter diesen Umständen werden wir immer "braucht NICHT neu" sehen.

12voto

Ilmari Karonen Punkte 47398

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.

10voto

zeller Punkte 4804

In Java müssen Sie immer new um Objekte zu instanziieren (nun ja, fast immer). Mit getAssests() Sie rufen eine bereits erstellte Datei ab. Ich vermute, Ihre Frage kommt aus C++, wo new weist dynamischen Speicher zu, aber da Java nur dynamische Objekte hat, ist new immer erforderlich.

4voto

PearsonArtPhoto Punkte 37354

Das new wird verwendet, wenn Sie den Konstruktor für eine Funktion aufrufen. getAssets() einen AssetManager zurückgibt, braucht er keinen neuen zu erstellen.

3voto

Philipp Wendt Punkte 2478

Durch die Verwendung von new Sie weisen dem Objekt Speicher zu.

Mit einer getXXX() wird verwendet, um ein vorhandenes Objekt zu erhalten, das bereits zugewiesen ist.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X