【问题标题】:Constructor object changes after declaration of constructor [duplicate]构造函数声明后构造函数对象发生变化[重复]
【发布时间】:2021-06-04 07:17:50
【问题描述】:

我有一个 BCD 类,里面有一个构造函数,并从 myArray 创建了一个名为“b”的 BCD 对象。当我更改 myArray 时,为什么 Java 也会更改 b,以及如何使两者“独立”,例如在声明后更改 myArray 时,b 保持不变?

public class BCD{
    private int digits;
    BCD(int[] digitArray){
        digits = digitsArray;
    public int nthDigit(int n) {
        return digits[n];
    }
    //more methods
   
    public static void main(String[] args) {
        int[] myArray = {1,2};
        BCD b = new BCD(myArray);
        myArray[1]=3;
        System.out.println(b.nthDigit(1));

}

【问题讨论】:

  • 你需要克隆阵列。
  • 顺便说一句:digitArray = digits;不可能是正确的,不是digits = digitArray;吗? (并且赋值不会复制数组内的值,它只是使左侧变量包含与右侧相同的对象)
  • 问题中写的代码无法编译。
  • @user15244370 – 不,这是错误的,至少是句子的第二部分!正确的是:它只是让左边的变量引用与右边的相同的对象。
  • @user15244370 – 抱歉,没有!如果你想对变量使用“包含”,它仍然是对它包含的对象的引用,而不是对象本身。措辞不够精确是提出此类问题的原因!

标签: java constructor


【解决方案1】:

您将对象引用传递给该构造函数,因为对该对象所做的所有修改都将反映到该对象的持有引用。

【讨论】:

    【解决方案2】:

    克隆数组。

    int[] a = {1,3};
    int[] b = a.clone();
    a[1]=33;
    System.out.println(a[1]);
    System.out.println(b[1]);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-15
      • 2012-10-10
      • 2020-09-13
      • 1970-01-01
      • 2016-08-11
      相关资源
      最近更新 更多