`Arrays,copyOf`没有按照预期做对象的深层复制

时间:2013-05-19 19:34:26

标签: java deep-copy

我的课程Book可以有很多Authors。我将类Author的几个对象传递给类Book的构造函数,然后按Arrays.copyOF复制这些对象,但如果我更改了对象外的任何Author数据,它将随处更改所以这意味着还没有创建副本。

我想创建深层副本。代码正在编译并运行,没有错误。

import java.util.Arrays;

public class Book {
    private String tytul;
    private int rokWydania;
    private Author[] autorzy;

    public Book(String tytul, int rokWydania, Author... autorzy) {
        this.tytul = tytul;
        this.rokWydania = rokWydania;
        this.autorzy = Arrays.copyOf(autorzy, autorzy.length);
    }

    public String toString() {
        String s = "      Tytuł: " + tytul +"\nrok wydania: " + rokWydania + "\n";
        if(autorzy.length == 1)
            s+="      Autor: " + autorzy[0];
        else{
            s+="    Autorzy: " + autorzy[0];
            for(int i = 1; i < autorzy.length; i++)
                s+="\n             " + autorzy[i];
        }       
        return s + "\n\n";
    }

    public static void main(String[] args) {
        Author a1 = new Author("Isabel", "Allende", 1942);
        Author a2 = new Author("Manueala", "Gretkowska", 1964);
        Author a3 = new Author("Piotr", "Pietucha", 1954);

        Book b1 = new Book("Suma naszych dni", 2010, a1);
        Book b2 = new Book("Polka", 2001, a2);
        Book b3 = new Book("Sceny z życia pozamałżeńskiego", 2003, a2, a3);

        a2.zmienInformacje("Tove", "Jansson", 1956);
        Book b4 = new Book("Lato muminków", 2006, a2);

        System.out.println(b1);

        System.out.println(b2);

        System.out.println(b3);

        System.out.println(b4);
    }
}

public class Author {
    private String imie, nazwisko;
    private int rokUrodzenia;

    public Author(String imie, String nazwisko, int rokUrodzenia) {
        this.imie = imie;
        this.nazwisko = nazwisko;
        this.rokUrodzenia = rokUrodzenia;
    }

    public String getImie() {
        return imie;
    }

    public String getNazwisko() {
        return nazwisko;
    }

    public int getRokUrodzenia() {
        return rokUrodzenia;
    }

    @Override
    public String toString() {
        return  imie + " " + nazwisko + " (ur. " + rokUrodzenia + ")";
    }

    public void zmienInformacje(String imie, String nazwisko, int rokUrodzenia) {
        this.imie = imie;
        this.nazwisko = nazwisko;
        this.rokUrodzenia = rokUrodzenia;

    }

}

期望的输出:

     Tytuł: Suma naszych dni
  rok wydania: 2010
        Autor: Isabel Allende (ur. 1942)


        Tytuł: Polka
  rok wydania: 2001
        Autor: Manuela Gretkowska (ur. 1964)


        Tytuł: Suma naszych dni
  rok wydania: 2010
      Autorzy: Manuela Gretkowska (ur. 1964)   
               Piotr Pietucha (ur. 1954)


        Tytuł: Lato muminków
  rok wydania: 2006
        Autor: Tove Jansson (ur. 1956)

我的输出

      Tytuł: Suma naszych dni
rok wydania: 2010
      Autor: Isabel Allende (ur. 1942)


      Tytuł: Polka
rok wydania: 2001
      Autor: Tove Jansson (ur. 1956)//WRONG


      Tytuł: Sceny z życia pozamałżeńskiego
rok wydania: 2003
    Autorzy: Tove Jansson (ur. 1956)//WRONG
             Piotr Pietucha (ur. 1954)


      Tytuł: Lato muminków
rok wydania: 2006
      Autor: Tove Jansson (ur. 1956)

1 个答案:

答案 0 :(得分:1)

我认为Arrays.copyOf工作正常。在打印a2.zmienInformacje("Tove", "Jansson", 1956);之前,您正在更新Author a2的问题符合Book b2 and b3