我只用Java编程了几个月,所以我对Java没有那么的经验(尽管我应该了解一些技巧和基本知识)。
我遇到了一个显而易见的问题,但我看不到。
"_"
这是我的代码的一部分。
这怎么可能是真的?这是两个单独的对象。我不明白。
在我的main方法中直接调用foo方法(出于测试目的)。
如果您需要LabelText的构造函数,则为:
public class SomeClass {
private final int[] numbers = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
private LabelText AText = new LabelText('A', numbers);
private LabelText BText = new LabelText('B', numbers);
public void foo() {
AText.numbers[6] = -1;
BText.numbers[3] = -1;
if (BText.numbers[6] == -1) System.out.println("Wtf?");
}
}
答案 0 :(得分:15)
因为您是在没有复制的情况下将引用传递给numbers
,所以两个对象最终都指向相同的 int[]
实例。虽然有两个不同外部对象,但它们都指向的内部对象是同一对象,因此您可以通过取消引用{{1}中的任何一个来更改该内部对象}和AText.numbers
,并且访问两个外部对象的BText.numbers
字段时,更改将在两个外部对象中可见。
您可以检查numbers
将返回AText == BText
,但是false
将返回AText.numbers == BText.numbers
。并且true
也将返回this.numbers == AText.numbers
。
就像尝试使用相同的代码,但使用以下构造函数:
true
答案 1 :(得分:4)
Java中的对象刷新:
在Java编程语言中,有两种数据类型:基本和引用。
示例Java对象:
String
之类的类,
Exception
,Integer
和File
。使用以下方法创建对象
类。另外,可以创建自定义类和对象-
例如Person
或LabelText
。如下创建Java对象。如果Person
是课程:
public class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public void setName(String s) {
name = s;
}
public String getName() {
return name;
}
public void setAge(int i) {
age = i;
}
public int getAge() {
return age;
}
}
考虑代码:
Person personA = new Person("A", 32);
在上面的语句中,Person
是一个类,personA
是一个变量,new Person(..)
创建一个类型为Person
的对象。 =
将新创建的Person
对象分配给变量personA
。 personA
是引用类型的变量,它指向或引用新创建的Person
对象。
Person
类具有属性name
和age
。这些代表对象的状态。通常,状态在对象之间有所区别。
此引用类型的行为如何?请参见以下示例代码:
public class TestingReferences {
public void foo() {
Person a = new Person("A", 32); // 1
Person b = new Person("B", 28); // 2
Person c = a; // 3
a.setName("X"); // 4
System.out.println("Are the names of a and c equal? " +
a.getName().equals(c.getName())); // 5
}
}
public static void main(String [] args) {
TestingReferences app = new TestingReferences();
app.foo();
}
}
在上面的示例代码中,注意在方法foo()
中打印的输出-人 a 和 c 都具有相同的名字 X < / em>。这是怎么发生的?
1:Person a = new Person("A", 32);
将创建一个新的人物对象并将其分配给变量a
。
2:Person b = new Person("B", 28);
将创建一个新的person对象并将其分配给变量b
。
3:Person c = a;
创建了一个人变量c
,并且为它分配了参考变量a
。在此阶段,参考变量a
和c
都指向或引用同一个人对象(请参见下图)。
4:a.setName("X");
人员对象a
的{{1}}从“ A”更改为“ X”。
5:name
打印System.out.println("Are the names of a and c equal? " + a.getName().equals(c.getName()));
!
由于两个引用变量true
和a
都指向同一个对象,因此两个引用都可以看到对象状态的任何变化。
如果将语句添加到c
:foo
,则c.setAge(44);
和age
的人的a
都设置为44。
上面的示例演示了对象引用在Java编程语言中的行为。这篇文章中的问题也是如此。
来自帖子的问题:
请注意,原始数组(如c
)和对象数组(int[]
)的数组都是对象。
1:Person[]
2:private final int[] numbers = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
3:private LabelText AText = new LabelText('A', numbers);
以上三个语句中有三个对象和引用变量。请注意,private LabelText BText = new LabelText('B', numbers);
对象引用已分配给numbers
和AText
的状态。 BText
数组的所有这三个引用都指向在第1行中创建的同一数组对象。现在,在方法numbers
中:
foo()
将此语句添加到方法AText.numbers[6] = -1;
BText.numbers[3] = -1;
(BText.numbers[6] == -1) ... returns true -and-
(AText.numbers[3] == -1) ... also, returns true.
中:foo
打印:System.out.println(java.util.Arrays.toString(numbers));
。请注意位置 3 和 6 中的数组值。