import java.util.ArrayList;
public class Test {

static void print(ArrayList al){

al.add(2);
System.out.println(al.get(0));
System.out.println(al.get(1));
System.out.println();


al=new ArrayList();
al.add(3);
al.add(4);

System.out.println(al.get(0));
System.out.println(al.get(1));
System.out.println();
}

public static void main(String args[]){
Test test=new Test();
ArrayList al=new ArrayList();
al.add(1);

print(al);
for(int i=0;i<al.size();i++){
System.out.println(al.get(i));
}
System.out.println();
System.out.println(al.get(1));
System.out.println();
}}
预期的结果是4 为啥输出结果是2呢 arraylist 不是引用类型吗? 求大大解释下  

解决方案 »

  1.   

    1.static void print(ArrayList alArg)
    2. ArrayList al=new ArrayList();
            al.add(1);
            
            print(al);print(al)的参数al和print(ArrayList alArg)的alArg不是一个,alArg是al的副本,与al指向同一个对象。
    方法中 alArg=new ArrayList();之后,两者指向的不是同一个对象了。
      

  2.   

    哦,原来你问的是形参的问题,我还真没很注意这个问题。答案很简单,你已经说了:方法中 al=new ArrayList();之后,两者指向的不是同一个对象了。所以Main函数中的al,仍然有两个数据项:1 和 2。
    而print函数中的新al,由于只是个形参,所以不可能取代Main中的al。
      

  3.   

    再补充下,你把al当作Windows的快捷方式来设想。main函数是一个目录,里面放了个快捷方式:al;
    print函数是另一个目录,里面也放了快捷方式:al,初始取值是复制的main函数的al所保存的目标路径;
    后来print函数中把快捷方式al中保存的目标路径修改了,但显然main函数中的那个快捷方式al中所保存的目标路径并不会被修改。
      

  4.   

    print(al)的参数al和print(ArrayList alArg)的alArg不是一个,alArg是al的副本,与al指向同一个对象。
    方法中 alArg=new ArrayList();之后,两者指向的不是同一个对象了。  有点明白了
    也就是说 al.add(1); al.add(2); 作用于一个对象print()中的 al=new ArrayList(); 声明了1个新的arraylist 是局部变量 对吗?
      

  5.   


    没错!跟古老的问题:如何用Java写一个swap(int a,int b)函数是类似的问题。
      

  6.   

    ldh911 说的意思没啥问题,不过1楼写的运行结果是不对的哟。
      

  7.   

    print()方法中的al=new ArrayList()这句话是为a1又重新被赋予了一个新的对象,换句话说a1的地址被更换了,之后用到a1的地方用的都是现在的地址(除非被重新赋值),之前的操作现在已不存在任何影响al.add(3);al.add(4);添加了两个item,所以数量为2