2017-02-21 4 views
0

Hey Leute, ich bin neu in Java Programmierung. Ich habe versucht, mit Java-Klassen zu experimentieren und was ich getan habe ist, dass ich eine Instanzvariable x und dann y erstellt habe, die die Werte von x kopiert. Dann definiere ich einen Konstruktor, der den Wert oder x als Argument nimmt. Jetzt, wenn ich versuche, den Wert von y zu drucken, gibt es den Wert als 0, während oder x es gibt 5. Warum ist das Problem passiert? Wenn wir neues Schlüsselwort und den Konstruktor verwenden dann nur alle Instanzfelder so erstellt werden, ich fühle mich wie nach einemJava Klassenobjekt Dynamische Speicherzuweisung

/* 
* To change this license header, choose License Headers in Project Properties. 
* To change this template file, choose Tools | Templates 
* and open the template in the editor. 
*/ 
package test; 
/** 
* 
* @author Mridul 
*/ 
public class Test { 
int x; 
int y=x; 
Test(int a) 
{ 
    x=a; 

} 
void print() 
{ 
    System.out.println(x); 
} 
    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String[] args) { 
     Test ob=new Test(5); 
     ob.print(); 
     System.out.println(ob.y); 


     // TODO code application logic here 
    } 

} 

Output 
5 
0 

verwenden Wenn wir neues Schlüsselwort und den Konstruktor verwenden dann nur alle Instanzfelder so erstellt werden, ich fühle mich wie, nachdem wir verwenden sollten

Test ob=new Test(5); 

Dann nur alle Codes in der Klasse (x, y = x) laufen und es sollte nicht das Problem geschaffen haben. Bitte Hilfe

+0

für 'int'' x = a' ist eine Art von * copy *, jede Änderung von 'a' wird nicht in' x' nach dem '=' reflektiert (und 'int x;' ist äquivalent zu 'int x = 0') –

+0

aber in der Ausgabe gibt es x = 5 und y = 0 –

+0

... weil die Instanzfeldinitialisierung _before_ Konstruktoranweisungen ausführt. – Seelenvirtuose

Antwort

0

Wenn Sie eine neue Instanz von Test schaffen, das (in der Reihenfolge) geschieht:

int x; // x = 0 
int y=x; // y = 0 
Test(int a) 
{ 
    x=a; // x = your a value 
} 

=> Community Wiki, fühlen Sie sich frei zu ....

0

hier, um diese:

int y=x; 

geschieht einmal, vor yo Ihr Konstruktor wird ausgeführt.

So ändert der ctor den Wert von x; aber y bleibt auf dem vorherigen Wert. (x erhält anfangs den Standardwert 0; das geht in y; und dann wird der ctor ausgeführt und ändert x auf den Wert von a).

Und bitte beachten Sie: Das hat nichts mit "dynamische Zuweisung" zu tun. new bewirkt dreierlei:

  • Speicher
  • zugeordnet ist
  • Felder des neuen Objekts init'ed
  • der angegebene Konstruktor aufgerufen wird

(siehe here für weitere Details). Wenn Sie wollen, dass y den gleichen Wert wie x hat; Just do

öffentliche Klasse Test final int x, y;

Test(int incoming) { 
    x = incoming; 
    y = incoming; 
} 
0

Wenn Sie einen Konstruktor aufrufen new verwenden, dann beginnt Java die neu zugeordneten Objekt zu konstruieren. Die Werte der Instanzfelder (in Ihrem Fall von Feld x und Feld y) werden durch ein Regelwerk festgelegt.

  • Zuerst werden die Instanzfelder initialisiert. x hat den Standardwert (0); y erhält den Wert x, der 0 ist.
  • Dann wird im Konstruktor x auf den Wert a gesetzt.

y ist noch 0, weil es vor seinen Wert erhältx auf den Wert von a eingestellt ist.

0

new operator ist für die automatische Speicherzuweisung, um den benötigten Speicher für ein Objekt zuzuweisen, müssen Sie die new operator verwenden.

Verwandte Themen