2017-02-21 44 views
0

Привет, ребята Я новичок в java-программировании. Я пытался поэкспериментировать с Java-классами, и то, что я сделал, это то, что я создал переменную экземпляра x, а затем y, которая копирует эти значения x. Затем я определяю конструктор, который принимает значение или x в качестве аргумента. Теперь, когда я пытаюсь напечатать значение y, он дает значение как 0 в то время как или x оно дает 5. Почему проблема происходит? Когда мы используем новое ключевое слово и конструктор, то создается только все поля экземпляра, так что я чувствую, что после того, как мы используемОбъект класса Java Динамическое распределение памяти

/* 
* 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 

Когда мы используем новое ключевое слово и конструктор, то создается только все поля экземпляра, так что я чувствую как после того, как мы используем

Test ob=new Test(5); 

Тогда только все коды в классе (х, у = х) должен работать, и он не должен был создать проблему. Пожалуйста, помогите

+0

для 'int'' x = a' является своего рода * копией *, любое изменение 'a' не отражается на' x' после '=' (и 'int x;' эквивалентно 'int x = 0') –

+0

, но на выходе он дает x = 5 и y = 0 –

+0

... потому что инициализация поля экземпляра запускает операторы конструктора _before_. – Seelenvirtuose

ответ

0

При создании нового экземпляра Test, это происходит (в порядке убывания):

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

=> сообщества вики, не стесняйтесь ....

0

это здесь:

int y=x; 

происходит раз, перед йо Ур конструктор выполнен.

Таким образом, ctor изменяет значение x; но y остается прежним. (x сначала получает значение по умолчанию 0, которое переходит в y, а затем выполняется ctor и меняет x на значение a).

И обратите внимание: это не имеет никакого отношения к «динамическому распределению». new вызывает три вещи:

  • память выделяется
  • поля нового объекта init'ed
  • указанный конструктор вызывается

(см here для более подробной информации). Если вы хотите, чтобы у имело то же значение, что и x; just do

открытый класс Тест final int x, y;

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

При вызове конструктора с помощью new, то Java начинает строить вновь выделенного объекта. Значения полей экземпляра (в вашем случае поля x и поле y) определяются набором правил.

  • Во-первых, поля экземпляра инициализируются. x имеет значение по умолчанию (0); y получает значение x, что составляет 0.
  • Затем в конструкторе x установлено значение a.

y еще 0, потому что он получает свое значение перед темx устанавливается на значение a.

0

new operator предназначен для автоматического распределения памяти, для выделения необходимой памяти для объекта, вы должны использовать new operator.

Смежные вопросы