0

クラスFooを呼び出すBarというメインクラスがあり、ディープコンストラクターを正しく配置したと思います

ディープコピーコンストラクターの目的は、あるオブジェクトの内容を別のオブジェクトにコピーすることであり、コピーされたオブジェクトを変更しても、元のオブジェクトの内容は変更されません。

私のコードはそれを行いますが、元のオブジェクト変数を設定したときに、コピーするオブジェクトにその設定変数が含まれておらず、デフォルトのコンストラクター変数のみが含まれている理由がわかりません。

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;
}
}
4

2 に答える 2

7

それディープコピーではありません。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?
    }
}
于 2012-09-11T23:35:32.597 に答える
0

まず、Stringは不変であるためFoo、実際には深さがありません。そのため、ディープ コピーとシャロー コピーの違いは実際には存在しません。不変型フィールドの場合、設定this.field = other.fieldによりthis浅いコピーが作成されます。のディープ コピーを作成する必要がありますother.field(不変フィールドまたはプリミティブ フィールドのみを持つオブジェクトに到達するまで再帰的に)。

第二に、あなたのコードのコメントの質問に答えるために、それは私にとって正しく機能します。System.out.println(object2.getName1());出力しますqwertyuiop

于 2012-09-12T00:27:45.927 に答える