【问题标题】:Are all arrays declared as a class variable supposed to be static?所有声明为类变量的数组都应该是静态的吗?
【发布时间】:2019-12-04 09:30:02
【问题描述】:

我正在尝试编写一个代码,该代码递增一个声明为类变量的整数数组,分别使用该类的 2 个不同对象。

class Foo {
    int n[];

    Foo(int n1[], int x, int y) {
        n = new int[]{0, 0, 0, 0};
        n1[0] = n1[0] + x;
        n1[1] = n1[1] + y;
        this.n = n1;
    }
}

public class stats {
    public static void print(Foo obj) {
        for (int i = 0; i < obj.n.length; i++) {
            System.out.println(obj.n[i]);
        }
    }

    public static void main(String[] args) {
        int n[] = {1, 1, 1, 1};
        Foo a = new Foo(n, 1, 1);

        Foo b = new Foo(n, 2, 2);
        print(a);
        print(b);

    }
}

预期输出:

2
2
1
1
3
3
1
1

实际输出

4
4
1
1
4
4
1
1

尽管没有将变量声明为静态变量,但是否有理由将对象中的数组递增为静态变量?就像每个整数数组都声明为类变量一样是静态的吗?我将如何获得预期的输出?

【问题讨论】:

  • this.n = n1; 用参数n1 的数组对象覆盖字段n
  • 您在class Foo 中声明的int n[];实例变量,而不是类变量。类变量是用 static 关键字声明的变量。

标签: java arrays class object


【解决方案1】:

重要的部分是this.n = n1;
这意味着两个对象都引用了您在 main 方法中创建的同一数组 n

【讨论】:

    【解决方案2】:

    Foo 参数中,您将新值写入n1 参数(与nmain 方法中引用的数组相同)。

    您在构造函数中分配了一个新数组,但您从未真正使用它,并在构造函数的最后一行用this.n = n1 覆盖对它的引用。

    【讨论】:

      【解决方案3】:

      ab 增加同一个数组的原因是因为您已将 n 传递给两者。保存在类中的变量不是实际的数组,而是对数组的内存引用。因此,由于您已将相同的内存引用 (n) 传递给两个对象,因此它们都在修改内存的同一部分。它与静态几乎没有关系。如果您希望它们都有不同的数组,则必须创建n 的副本,这样您就有两个数组,分别在内存中。

      【讨论】:

      • 它是否仅指向数组的内存引用?我注意到,当我将 this 与 int 一起使用时,它指向的却是值。
      • 内存引用案例不适用于 int 和 char 等原始类型,因为这些类型是不可变的。如果您将 int 传递给修改它的函数,则传递的 int 将被复制,以便它保留其原始值。然而,对于所有对象,变量实际上是指为堆栈上的对象分配的内存。
      【解决方案4】:

      这是因为您的数组的引用(不是副本)被传递给 Foo 的构造函数。

      在你的主要功能中:

      数组被声明

      int n[] = {1, 1, 1, 1};
      

      // 下一条语句将n的值更改为{2,2,1,1}。这个数组将保存在Foo类中

      Foo a = new Foo(n, 1, 1); 
      

      //现在记住main方法中n的值是{2,2,1,1}

      Foo b = new Foo(n, 2, 2);  // Here n = {2,2,1,1}
      

      main方法中的上述语句n之后变为{4,4,1,1}

      【讨论】:

        猜你喜欢
        • 2010-10-14
        • 1970-01-01
        • 2014-02-04
        • 1970-01-01
        • 1970-01-01
        • 2010-12-18
        • 1970-01-01
        • 1970-01-01
        • 2020-03-24
        相关资源
        最近更新 更多