Java:在创建时将值传递给对象时,假定要初始化的成员会发生什么?

时间:2014-04-28 06:05:05

标签: java constructor initialization

这个问题更多的是关于正确的Java程序构建。 我在想:

会发生什么
public Clazz { 
   this.someClazz = new SomeClazz(); 
}  //initialization

Clazz x = y; 

上面的构造函数是执行了,还是被跳过了,someClazz会立即成为一个新值?

3 个答案:

答案 0 :(得分:1)

您需要区分变量,对象和引用。

xy的值不是对象 - 它们只是引用。赋值运算符只是将右侧表达式中的值复制到左侧的变量。因此,在您的情况下,它会将y的值复制到x ...此时,两个变量的值都指向同一个对象。没有构造函数或任何其他成员被调用 - 它只是 复制一个值。例如:

// Assuming appropriate methods...
x.setFoo("new foo");
System.out.println(y.getFoo()); // Would print "new foo"

但是,两个变量仍然是独立的:

x.setFoo("new foo");
x = new Clazz();
x.setFoo("yet another foo");
System.out.println(y.getFoo()); // Would print "new foo"

此处,在第二行之后,xy的值引用不同的对象,因此调用x.setFoo()不会更改foo引用的对象中的y

答案 1 :(得分:1)

在代码段Clazz x = y;中,您没有创建任何新对象。您只是告诉我,现在,x引用将引用y指向的对象。

创建对象yClazz y = new Clazz();后,y开始引用堆中的对象。

y--------------------------> Obj1

以及Clazz x = y;

之后
x-----> y---------> Obj1 

实际上就像是

x--->Obj1<----y

这里,由于没有创建新对象,因此不会调用构造函数, 并且不会发生成员初始化,即this.someClazz = new SomeClazz();不会被执行。

答案 2 :(得分:0)

在您的代码中,您没有创建班级的新实例,只需将y的引用分配给变量x