关于下面的一段代码
import java.util.*;
public class Test{
public Test(){}
static void print(ArrayList al){
al.add(2);
al = new ArrayList();
al.add(3);
al.add(4);
}
public static void main(String[] args){
ArrayList al=new ArrayList();
al.add(1);
print(al);
System.out.println(al.get(1));
}
}
}
为什么运行的结果是2,菜鸟求解惑
------最佳解决方案--------------------
你那个代码和下面的效果是一模一样的、原理估计你也就明白了。
import java.util.*;
public class Test{
public Test(){}
static void print(ArrayList al){
al.add(2);
a2 = new ArrayList();
a2.add(3);
a2.add(4);
}
public static void main(String[] args){
ArrayList al=new ArrayList();
al.add(1);
print(al);
System.out.println(al.get(1));
}
}
}
------其他解决方案--------------------
当然是2了,这个看似引用传递,实则不是。
static?void?print(ArrayList?al){
?????????al.add(2);//这里的a1为传递过来的引用,它指向原传递的对象,下面虽然修改了指向,但原来list对象在内存中的值还是存在的,因为在该方法外面(mian方法的第二句)有引用。
?????????al?=?new?ArrayList(); //这一句代码,将a1的引用指向了新的list对象,即内存中新产生的对象。
?????????al.add(3); //这一句和下面的一句操作的都是新的对象,由于a1失去了原来指向的对戏那个的引用,故无法再操作原来的对象。
?????????al.add(4);
?????}
?????public??static?void?main(String[]?args){
???????ArrayList?al=new?ArrayList();
?????????al.add(1);
???????print(al);//在方法内的a1失去了原来的引用,但只在方法内起作用,在main方法中a1始终指向的最初的对象,或者说内存,即在main方法中的a1无法操作方法内新的对象。
???????System.out.println(al.get(1));
?????}
------其他解决方案--------------------
既然是新的对象的话,那原来的对象不是应该是丢失被内存释放了么?MAIN 方法中的 AI 对象又是指的哪个?
------其他解决方案--------------------
main方法中的ArrayList al=new ArrayList();是一个对象
print中的al = new ArrayList();又是一个对象 你去仔细看看new关键字的定义就明白了
------其他解决方案--------------------