为什么下面程序的输出是这样的? [重复]

问题描述 投票:0回答:2

考虑以下程序

class A{
    public void foo0(){
        ArrayList<Integer> tmp = new ArrayList<>();
        tmp.add(1);
        System.out.println(tmp.size());
        
        foo1(tmp);
        
        System.out.println(tmp.size());
        
        foo2(tmp);
        
        System.out.println(tmp.size());
    }
    
    public void foo1(ArrayList<Integer> tmp){
        tmp = new ArrayList<>();
    }
    
    public void foo2(ArrayList<Integer> tmp){
        tmp.add(4);
    }
}
public class Main
{
    public static void main(String[] args) {
        A obj = new A();
        obj.foo0();
        
    }
}

我的预期答案是 1 0 1 考虑通过引用场景。但实际输出不同 输出:- 1 1 2

java arraylist scope pass-by-reference
2个回答
0
投票

好吧,所以你知道在 Java 中,当你将一个对象传递给一个方法时,你实际上只是给它一个原始对象的“方向”,对吧?就像,你没有给它实际的对象,只是一种找到它的方法。这就是我们所说的参考。

现在,在您的 foo1() 方法中,您将遵循这些指示,将它们揉成一团,然后扔掉。你是说,“我不在乎你指的是哪里,现在你指的是我刚刚创建的这个全新的 ArrayList。”但问题是,这对 foo0() 中的原始 ArrayList 没有任何作用。在那里,什么都没有改变,因为 foo1() 只是弄乱了它自己的本地方向副本。

但是,在 foo2() 中,情况就不同了。在那里,您不会更改 tmp 指向的位置。你只是去那个位置并添加新的东西。所以当你回到 foo0() 时,你可以看到那个变化。

所以,当你运行整个过程时:

你从一个大小为 1 的 ArrayList 开始。 foo1() 不会改变原始 ArrayList 的任何内容,因此它的大小仍然为 1。 foo2() 添加另一个元素,将大小增加到 2。 这就是您看到 1 1 2 而不是 1 0 1 的原因。希望对您有所帮助,伙计!让我知道您是否还有其他好奇。


-1
投票

您在 Java 的工作原理上存在根本差距,但让我向您解释一下:

  1. 你添加数字 1 并且列表中有 1 个元素,所以大小为“1”
  2. 您调用 foo1 并在其中初始化对空的新 ArrayList 的引用,这就是第二个为“0”的原因
    println
  3. 在 foo2 中,您添加一个元素并再次打印大小,这就是大小为“1”的原因
© www.soinside.com 2019 - 2024. All rights reserved.