在 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
实例,f1
和 f2
引用(指向)不同的 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= 中实现所需的行为] 方法。
如果我有这样的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?
首先,您需要了解“按引用传递”的真正含义。 (例如,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
实例,f1
和 f2
引用(指向)不同的 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= 中实现所需的行为] 方法。