在 Java 中是通过引用传递给其他 类 的对象属性

In Java are object attributes passed by reference to other classes

如果我有这样的class:

public class First {
   int x = 1;
}

和第二个 class:

class Main {
   public static void main(string args[]) {
      First someObject = new First();
      someObject.x = 2;
   }
}

someObject.x 等于 2,或者 class 之后创建的第一个对象的任何对象都将初始化为它的 x 属性等于 2。如果不是,如何更改默认值由 class First?

制成的任何物体的 x

首先,您需要了解“按引用传递”的真正含义。 (例如,here。)传递语义指的是 procedure/method/subroutine/function 调用中参数发生的情况。在您的示例中,当您分配给 x 字段时,根本没有“通过”。

所以你的

In Java are object attributes passed by reference to other classes

是一个毫无意义的 and/or 无关紧要的问题。 (但简单的答案是 Java 不支持“按引用传递”。句号。)


至于我认为你问什么,让我们从一些事实开始:

  • Field class 声明 x 为实例字段。

  • First 的每个实例都有自己的 x 字段“副本”。

  • x 字段是唯一一个实例的一部分。它不与任何其他 First 实例共享。

  • 这是 x 的声明类型无关的 ... 对声明类型为 的字段取模引用类型 将包含对对象的引用而不是对象本身。 (但是 int 不是 引用类型 。)

  • new First() 表达式创建了一个 First class 的新实例,它不同于 [= 的所有其他(过去、现在或未来)实例15=] 和 returns 它的参考。

因此,在这段代码中:

  First f1 = new First();
  First f2 = new First();
  f1.x = 2;
  System.out.println(f2.x);   // prints 1.

我们有两个 First 实例,f1f2 引用(指向)不同的 First 实例。如果您更改一个实例的 x 字段,则不会更改另一个实例的 x 字段。他们是不同的领域。


但是,如果您在 First 中将 x 声明为 static,则 x 不再是每个 First 实例的不同字段。它现在由 First.

的所有实例共享

As an addendum, how would one change the default value of x in the First class such that any new instance made afterwards would have a difference value of x to start?

首先,First 中的 int x = 1; 没有定义 Java 使用该术语的意义上的“默认”值。它实际上是一个初始化。 (默认值是您在没有初始化时看到的值。)

如果您想实现应用程序特定的默认值,该默认值对 First 的所有实例都是通用的并且可以追溯更改,您需要在 Java 代码中实现它。也许是这样的:

    public class First {
        static int defaultX = 1;
        private int x;
        private boolean xSet = false;

        public int getX() {
            return xSet ? x : defaultX;
        }

        public void setX(int x) {
            this.x = x;
            this.xSet = true;
        }
    }

请注意,为了实现我们想要的默认行为,我们必须隐藏 x 字段(使其私有)并在 getter 和 [=105= 中实现所需的行为] 方法。