【问题标题】:Copy an object containing an array复制包含数组的对象
【发布时间】:2014-02-28 19:07:27
【问题描述】:

如何复制包含其他对象数组的对象?这是我的复制构造函数:

public university(university univ)    {
    String name1=univ.getname();
    int numOfPublications1=univ.getnumOfPublications(); 
    Department[] depts1 =new Department[numOfDepts];
    depts1=univ.getdepts();
}  

这不起作用,因为数组不存在。

【问题讨论】:

  • 正确格式化你的代码,你就会明白为什么它不能编译了。
  • @JBNizet 为什么直到我的所有人都必须格式化它?有什么问题吗??
  • 是的。类的第一个字母应大写(大学),方法应以小字符开头,然后在其名称中的每个新“单词”都大写(getdepts),对于初学者。
  • @MarkusMillfjord 谢谢 :) 下次我会注意的。

标签: java arrays object constructor


【解决方案1】:

尝试这样做。

public university(university univ)    {
        String name1=univ.getname();
        int numOfPublications1=univ.getnumOfPublications(); 
        Department[] depts1 =new Department[numOfDepts];
        System.arrayCopy(univ.getdepts(),0,depts1,0,univ.getdepts().length);
//or this depts1 = Array.copyOf(univ.getdepts(),numOfDepts);
    }

【讨论】:

    【解决方案2】:

    您可以使用System.arraycopy() 复制数组的内容。

    class University {
      Department[] departments;
    
      University(University toCopy) {
        departments = new Department[toCopy.departments.length];
        System.arraycopy(toCopy.departments, 0, departments, 0, departments.length);
      }
    }
    

    【讨论】:

    • 这会创建一个浅拷贝。
    • 如果只需要数组的浅表副本,这将起作用(意味着不需要复制每个 Department 元素。)。
    • 是的。如果您需要复制Department 对象,请编写一个循环,将它们一一复制。
    • 或者也给Department一个拷贝构造函数。
    • 是的。对新手来说清楚一点,循环需要调用 Department 的复制构造函数。
    【解决方案3】:

    复制构造函数有很多问题,一般来说,克隆是可取的,但如果你确实想使用复制构造函数,方法如下:

    public University( University univ ){
        University univ_copy = new University();
        univ_copy.name = univ.getname();
        univ_copy.numOfPublications = univ.getnumOfPublications();
        univ_copy.departments = new Department[univ.numOfDepartments];
        System.arrayCopy( univ.departments, 0, univ_copy.departments, 0, univ.departments.length );
        return univ_copy;
    }
    

    你也可以一个一个地复制部门,而不是用数组复制一步一步复制。关键是您需要为副本分配一个新数组,而不是重新使用来自univ 的现有数组,因为那样您将没有数组的副本,只有指向原始数组的指针。

    【讨论】:

    • "复制构造函数有很多问题,一般情况下克隆比较好"。你能详细说明吗?我对复制构造函数没有任何问题。
    • 当涉及到继承时,可能会出现这种问题的一个例子。例如,如果您有多个不同的 University 子类,那么您将需要为每个子类使用不同的构造函数。然后,您就有了弄清楚应该使用哪个构造函数的复杂性。本质问题是继承是在运行时确定的,而复制构造函数是在编译时定义的。当然,有一些方法可以应对,但它可能会让人感到困惑和尴尬。因此,克隆通常更容易实现和调试。
    • 如果我理解你,我不同意。在构造函数中唯一需要避免的是调用公共函数(可能会在子类中被覆盖)。例如,不是从构造函数调用public reset(),而是让构造函数(公共reset函数)调用protected resetMC()(其中MCMyClass的缩写)。然后子类将有自己的protected resetSC()他们的公共reset()s 将调用super.reset() 然后resetSC()
    • 如果受保护的版本在您的 JavaDoc 中可见,它们也很容易记录。
    • “那么你就有了弄清楚应该使用哪个构造函数的复杂性。”我不明白。构造函数隐含在您要复制的对象中,it 只是调用它的超级复制构造函数。我认为不需要弄清楚任何事情
    【解决方案4】:

    深度复制整个大学班级,包括Department 数组中的每个元素,请更改以下内容:

    public university(university univ){
       ...
       Department[] depts1 =new Department[numOfDepts];
       depts1=univ.getdepts();
    }
    

    到这里:

    public university(university univ){
       ...
       depts1 =new Department[univ.depts1.length];
       for(int i = 0; i < univ.depts1.length; i++)  {
          depts[i] = new Department(univ.depts1[i]);
       }
    

    }

    这假设您的 Department 类也有一个复制构造函数。

    注意我已经改了

    Department[] depts = ...
    

    depts = ...
    

    如果您不这样做,那么新的 depts 数组将在您的构造函数结束时停止存在。

    【讨论】:

      【解决方案5】:

      除了您不遵循编码约定,使您的代码完全不可读之外,您应该复制(我假设您正在尝试这样做,因为您将 university 参数的实例提供给大学构造函数)部门,而不是首先创建一个部门数组,然后立即将其废弃并重新分配给参数的部门;

      //Get departments from argument 
      Department[] departments = univ.getdepts();
      
      //Create your own local departments, if any
      if (departments)
      {
          this.departments = new Department[departments.length];
      
          //Copy, either cloned versions or references depending on what you want, for each and every cell in the argument university's department
          for (int i = 0; i < departments.length; i++)
              this.departments[i] = departments[i];
      }
      

      【讨论】:

      • 你说的if (departments)是什么意思,这是合法的代码吗?
      • 是的,它是合法的,意思是“如果已定义”,如果定义了一个数组(!= null),则为真,否则为假(== null)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-20
      • 1970-01-01
      • 1970-01-01
      • 2020-11-15
      • 1970-01-01
      • 2019-07-23
      相关资源
      最近更新 更多