我有一个简单的IntList类,该类具有iterativeSize()方法。
public class IntList {
public int first;
public IntList rest;
public IntList(int f, IntList r) {
this.first = f;
this.rest = r;
}
public static void main(String[] args) {
IntList L = new IntList(15, null);
L = new IntList(10, L);
L = new IntList(5, L);
L.iterativeSize();
System.out.println(L.first) // this gives 5 instead of null
}
public int iterativeSize() {
IntList x = this;
int count = 0;
while (x != null) {
count++;
x = x.rest;
}
return count;
}
正如我想象的那样,原始的L应该变为null,因为while循环仅在x == null时才终止。由于x的内存地址为L,因此在以下情况下L应该为空:
L.iterativeSize();
但事实并非如此。为什么即使x(具有L的内存地址)变为null,L也不改变?
答案 0 :(得分:2)
IntList L;
和IntList x = this;
是不同的变量,即使它们在某一点上具有相同的值(对相同的IntList
实例的引用) 。因此,当x
为空时,对L
没有影响。
List<String> list1ref1 = new ArrayList<>(); // <-- only one instance created
List<String> list1ref2 = list1ref1; // <-- second reference to same instance
// both variables reference the same instance of the object
// thus they both 'add' to the same instance
list1ref1.add("1");
list1ref2.add("2");
System.out.println(list1ref1); // [1, 2]
System.out.println(list1ref2); // [1, 2]
// 'list1ref2' now does not reference any instance, aka null
list1ref2 = null;
// but `list1ref1` still references that original instance
System.out.println(list1ref1); // [1, 2]
System.out.println(list1ref2); // null
答案 1 :(得分:1)
this
是指向IntList
实例的指针。您可以将该指针复制到变量x
中,并且仅更改该指针本身,而不更改数据。而且您无需在主程序中更改L
,因此它保持不变,指向不变的数据。如果您要破坏某些内容,则应在您的 main 函数中编写L = L.rest
。
答案 2 :(得分:0)
您可以使用x作为指针来越过IntList的不同实例,但是它不会更改L的值。首先:L和x在不同的范围内。您只能在main方法内部更改L的值,因为它的范围在那里。 第二:要更改L的值,您需要一个明确的值分配命令,例如L = something。