关于Java中的引用传递(内存地址)的问题

时间:2018-11-27 14:37:28

标签: java pass-by-reference

我有一个简单的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也不改变?

3 个答案:

答案 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。