考虑以下程序
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 中,当你将一个对象传递给一个方法时,你实际上只是给它一个原始对象的“方向”,对吧?就像,你没有给它实际的对象,只是一种找到它的方法。这就是我们所说的参考。
现在,在您的 foo1() 方法中,您将遵循这些指示,将它们揉成一团,然后扔掉。你是说,“我不在乎你指的是哪里,现在你指的是我刚刚创建的这个全新的 ArrayList。”但问题是,这对 foo0() 中的原始 ArrayList 没有任何作用。在那里,什么都没有改变,因为 foo1() 只是弄乱了它自己的本地方向副本。
但是,在 foo2() 中,情况就不同了。在那里,您不会更改 tmp 指向的位置。你只是去那个位置并添加新的东西。所以当你回到 foo0() 时,你可以看到那个变化。
所以,当你运行整个过程时:
你从一个大小为 1 的 ArrayList 开始。 foo1() 不会改变原始 ArrayList 的任何内容,因此它的大小仍然为 1。 foo2() 添加另一个元素,将大小增加到 2。 这就是您看到 1 1 2 而不是 1 0 1 的原因。希望对您有所帮助,伙计!让我知道您是否还有其他好奇。
您在 Java 的工作原理上存在根本差距,但让我向您解释一下:
println