Dog*_*Dog 0 java constructor copy deep-copy
我有一个名为Bar的主类调用类Foo,我认为我正确地放入了一个深层构造函数
深拷贝构造函数的目的是将一个对象的内容复制到另一个对象,并且更改复制的对象不应该更改原始内容,对吗?
我的代码那样做,但我不明白为什么当我设置原始对象变量时,复制对象不包含该set变量,它只包含默认的构造函数变量.
public class Bar
{
public static void main(String[] args)
{
Foo object = new Foo();
object.setName1("qwertyuiop");
//the below line of code should copy object to object2?
Foo object2 = new Foo(object);
System.out.println(object.getName1());
//shouldn't the below line of code should output qwertyuiop since object2 is a copy of object? Why is it outputting the default constructor value Hello World?
System.out.println(object2.getName1());
//changes object2's name1 var to test if it changed object's var. it didn't, so my deep copy constructor is working
object2.setName1("TROLL");
System.out.println(object2.getName1());
System.out.println(object.getName1());
}
}
public class Foo
{
//instance variable(s)
private String name1;
public Foo()
{
System.out.println("Default Constructor called");
name1= "Hello World";
}
//deep copy constructor
public Foo(Foo deepCopyObject)
{
name1 = deepCopyObject.name1;
}
public String getName1() {
return name1;
}
public void setName1(String name1) {
this.name1 = name1;
}
}
Run Code Online (Sandbox Code Playgroud)
这不是深刻的副本.Java 不是 C++.您可以自由编写一个复制构造函数,该构造函数接受Foo实例并使用另一个Foo初始化它,但是没有语言支持来帮助您实现.这完全取决于你.
您还应该知道Java不像C++那样需要复制构造函数.Java对象存在于堆上.传递给方法的是对堆上对象的引用,而不是对象的副本.
您可以编写一个复制构造函数,但这取决于它的行为方式.你必须非常小心:
public class Foo {
private Map<String, Bar> barDictionary;
public Foo() {
this.barDictionary = new HashMap<String, Bar>();
}
public Foo(Foo f) {
// What happens here is up to you. I'd recommend making a deep copy in this case.
this.barDictionary = new HashMap<String, Bar>();
this.barDictionary.putAll(f.barDictionary); // Question: What about the Bar references? What happens to those?
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
13573 次 |
| 最近记录: |