Java对象是如何工作的?
为什么它会这样工作。。。对我来说,这与直觉相反 Test.java:Java对象是如何工作的?,java,object,Java,Object,为什么它会这样工作。。。对我来说,这与直觉相反 Test.java: public class Test { public TestObject obj1; public TestObject obj2; public Test() { obj1 = new TestObject(); obj1.setInt(1); obj2 = obj1; System.out.println("Should be t
public class Test {
public TestObject obj1;
public TestObject obj2;
public Test() {
obj1 = new TestObject();
obj1.setInt(1);
obj2 = obj1;
System.out.println("Should be the same: " + obj1.getInt() + ", " + obj2.getInt());
obj1.setInt(2);
System.out.println("Should be different? (2, 1): " + obj1.getInt() + ", " + obj2.getInt());
obj2.setInt(3);
System.out.println("Should be different? (2, 3): " + obj1.getInt() + ", " + obj2.getInt());
}
public static void main(String[] args) {
new Test();
}
}
TestObject.java
public class TestObject {
int integer;
public void setInt(int n) {
integer = n;
}
public int getInt() {
return integer;
}
}
令人惊讶的是,这会导致两个对象发生变化,从而使int integer相同
从逻辑上讲,如果我的逻辑有任何意义,我会假设将一个对象设置为等于另一个对象是一次性的,并且其中一个对象的任何更改都不会自动更改另一个对象。是否有我遗漏的东西,比如可能只有一个对象有两个引用?还是什么 执行赋值后,obj1和obj2都是对同一对象的引用。那以后呢
obj2=obj1
两个引用都指向同一个对象;所有结果都应该匹配。如果你想复制,你可以这样做
obj2=新的TestObjectobj1.getInt
或者创建一个新的构造函数,该构造函数接受一个实例并创建一个稍微好一点的API副本。完成赋值后,obj1和obj2都是对同一对象的引用。那以后呢
obj2=obj1
两个引用都指向同一个对象;所有结果都应该匹配。如果你想复制,你可以这样做
obj2=新的TestObjectobj1.getInt
或者创建一个新的构造函数,它接受一个实例并创建一个更好的API副本
也许只有一个对象有两个引用
对
此代码:
obj2 = obj1;
是一项参考作业。不会复制任何对象
也许只有一个对象有两个引用
对
此代码:
obj2 = obj1;
是一项参考作业。未复制任何对象。这两个对象都指向您完成分配时的同一内存对象:
obj2 = obj1;
无论您使用其中一个引用做了什么更改,更改都将对同一个内存对象进行。两个对象都指向与您完成赋值相同的内存对象:
obj2 = obj1;
无论您使用其中一个引用做了什么更改,都会对同一个内存对象进行更改。当您键入obj2=obj1;您基本上说过obj2和obj1的指针都应该指向相同的内存地址,因此指向相同的对象。 您应键入:
...
obj1 = new TestObject();
obj1.setInt(1);
obj2 = new TestObject();
...
键入obj2=obj1时;您基本上说过obj2和obj1的指针都应该指向相同的内存地址,因此指向相同的对象。 您应键入:
...
obj1 = new TestObject();
obj1.setInt(1);
obj2 = new TestObject();
...
没有对象被复制。。那就有道理了。我该如何使对象被复制?我必须手动创建第二个对象吗?不会复制任何对象。。那就有道理了。我该如何使对象被复制?我必须手动创建第二个对象吗?