这个问题更多的是关于正确的Java程序构建。 我在想:
会发生什么public Clazz {
this.someClazz = new SomeClazz();
} //initialization
Clazz x = y;
上面的构造函数是执行了,还是被跳过了,someClazz会立即成为一个新值?
答案 0 :(得分:1)
您需要区分变量,对象和引用。
x
和y
的值不是对象 - 它们只是引用。赋值运算符只是将右侧表达式中的值复制到左侧的变量。因此,在您的情况下,它会将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"
此处,在第二行之后,x
和y
的值引用不同的对象,因此调用x.setFoo()
不会更改foo
引用的对象中的y
。
答案 1 :(得分:1)
在代码段Clazz x = y;
中,您没有创建任何新对象。您只是告诉我,现在,x
引用将引用y
指向的对象。
创建对象y
,Clazz y = new Clazz();
后,y
开始引用堆中的对象。
y--------------------------> Obj1
以及Clazz x = y;
x-----> y---------> Obj1
实际上就像是
x--->Obj1<----y
这里,由于没有创建新对象,因此不会调用构造函数,
并且不会发生成员初始化,即this.someClazz = new SomeClazz();
不会被执行。
答案 2 :(得分:0)
在您的代码中,您没有创建班级的新实例,只需将y
的引用分配给变量x