2015-06-06 14 views
12

Ich weiß, dass this(...) verwendet wird, um einen Konstruktor einer Klasse von einem anderen Konstruktor aufzurufen. Aber können wir new für das gleiche verwenden?Kann "new" innerhalb des Konstruktors der Klasse verwendet werden, um einen anderen Konstruktor in Java aufzurufen?

Um in der Frage klarer zu sein, ist Line-2 gültig? Wenn es (wie der Compiler nicht beanstandete), warum ist der Ausgang null nicht Hello?

class Test0 { 
    String name; 

    public Test0(String str) { 
     this.name= str; 
    } 

    public Test0() { 
     //this("Hello"); // Line-1 
     new Test0("Hello"){}; // Line-2 
    } 

    String getName(){ 
     return name; 
    } 
} 

public class Test{ 
    public static void main(String ags[]){ 
     Test0 t = new Test0(); 
     System.out.println(t.getName()); 
    } 
} 
+1

Warum Sie das tun wollen? –

+1

@Lutz Horn Ich habe irgendwo irgendwo einen solchen Code gesehen und ich möchte die dahinterstehenden Grundlagen verstehen. – Dexter

+3

Sind Sie sicher, dass es Code mit derselben Semantik wie Ihre ist? Dieser Code wird kompiliert, aber es macht keinen Sinn. –

Antwort

25

Es ist gültig, aber es ist innerhalb dieses Konstruktor eine völlig getrennte Instanz von Test0 (genauer gesagt eine Instanz einer anonymen Unterklasse von Test0) zu schaffen, und es wird nirgendwohin verwendet. Die aktuelle Instanz hat immer noch das Feld name auf null festgelegt.

public Test0() { 
    // this creates a different instance in addition to the current instance 
    new Test0("Hello"){}; 
} 

Beachten Sie, dass, wenn Sie die new Operator mit dem Konstruktor ohne Argumente aufrufen, würden Sie einen StackOverflowError bekommen.

+9

Eigentlich ist es keine Instanz von 'Test0' Erstellung selbst, sondern von einer anonymen Unterklasse von' Test0'. (Dies hat nichts in diesem Fall ändern, da das Objekt sowieso weggeworfen wird.) –

+0

@ PAULO Ebermann Tatsächlich habe ich verpasst, dass. – manouti

5

Zeile 2 ist eine gültige Anweisung. Deshalb hat der Compiler keine Fehler angezeigt. Aber dort erstellen Sie ein anonymes Objekt. Es wird bald verschwinden, nachdem Sie den Konstruktor verlassen haben. Daher ist der Wert immer noch Null, weil dem nichts zugewiesen wurde.

new Test0("Hello"){}; 

Über Leitung wird eine anonyme Instanz TEST0 Klasse erstellen und den Wert Hallo auf den Namen Variablen zugewiesen. Da Sie die erstellte anonyme Instanz jedoch nicht beziehen, wird sie aus der unmittelbaren Nachfolgezeile entfernt. Sie haben also der Variablen name der Instanz, die das jeweilige Codesegment aufruft, noch keinen Wert zugewiesen. Deshalb Name null

Im Speicher ist es wie ist

enter image description here

6

Was Sie versuchen, durch den Code erreicht zu tun ist, Sie auf Kommentar:

public Test0() 
{ 
    this("Hello"); 
} 
+1

Ich bin mir sicher, dass der Fragesteller das bereits weiß. –

3

Weil Sie ein erstellen neue Instanz von Test0 mit dem Namen "Hallo", aber niemals verwenden.

public Test() { 

    new Test0("hello") // nothing is referencing this new object 
} 

Sie einfach ein Objekt in einem anderen Konstruktor zu schaffen, aber es wird keine Auswirkungen auf die Instanz durch den ersten Konstruktoraufruf haben geschaffen.

3

Sie können dies tun, aber das Ergebnis dieser new Nutzung wird am Ende des Konstruktors gegangen. Insbesondere wird t.namenull sein.

Verwenden Sie this("Hello").

3

Name ist die Instanzvariable. Instanzvariablen sind objektspezifisch.

Mit neuer Test0 ("Hallo"); erstellen Sie eine neue Instanz von Test0.

Wenn Sie t haben möchten.getName() return „Hallo“ [Ich meine Feldwert unabhängig von Objekt] die name Feld statisch:

static String name; 
+1

Das ist ein schlechter Rat - es gibt keinen Grund eine statische Variable von einem Konstruktor zu manipulieren. (Auch dies würde bedeuten, dass ** alle ** Instanzen den gleichen Wert teilen.) –

+1

Ich sorry..not irgendwelche Ratschläge zu geben. Dies ist ein Testprogramm und versucht, Instance, statische Differenzierung hervorzuheben. – Rajesh

0

Sie können unter code..Since u haben hier verwendet, um durch durch den Einsatz neuer Keyword-Ausgabe anzuzeigen public Test0(){new Test("Hello){};"{} geschweifte Klammern sind nicht wichtig..so, wenn test0() Konstruktor aufgerufen wird ... Innerhalb dieses Konstruktors test0(args); wird im ersten Konstruktor bt im ersten Konstruktor aufgerufen didnot Ausgabe angezeigt .. wo wird Ihr "Hallo" wird angezeigt..so nur bearbeiten

`

public test0(String str) 
{ 
this.name=str; 
System.out.println(str); 
}` 

Und Sie werden ur gewünschten output..See mein Code unten haben ..

class test01{ 
public test01(String str) 
{System.out.println(str); 
    } 
public test01(){ 

    new test01("Print"); 
} 
}public class Const { 
public static void main(String args[]) 
{test01 t = new test01(); 

    //System.out.println(t.getName()); 
    }} 

Der Ausgang dieses Codes geben u erforderlich String

Verwandte Themen