public class demo {
public static void demo(int b) {
b = 3;
}
public static void demo2(ArrayList al) {
al.add(100);
}

public static void main(String[] args) {
int b = 1;
demo(b);
System.out.println(b);

ArrayList al = new ArrayList();
al.add(1);
al.add(2);
al.add(3);
demo2(al);
System.out.println(al.size());
}
}纳闷了,为什么同样是没有返回值的方法,为什么第一个b的结果是原来的1,而第二个al的结果却是改变后的值4呢

解决方案 »

  1.   

    这个我当然知道,为什么会这样呢?java到底是按什么传递的!?
      

  2.   

    public static void demo(int b) {
    b = 3;   
    //这里的b和main()里的b,不是同一个变量
    //基本变量分配在栈里,它们2个占用不通的栈空间
    //修改demo()的b变量,不会改变main()的b变量
    }
    public static void demo2(ArrayList al) {
    al.add(100);
    //这里的al和main()里的al,也不是同一个变量
    //它们的引用存放在栈里,它们的引用也占用不通的栈空间
    //但是,他们指向堆里的同一块内地址,他们引用了同一个对象
    //调用方法是调用的同一个对象的方法,操作到了同一快堆内存空间
    }
      

  3.   

    如图,图中只是示意图,并不完全正确,途中的一个方框不是表示一个字节内存,表示4个字节内存(一个int的长度)
      

  4.   

    这是java内存中栈与堆的应用,也就是值传递。第一个采用的是值传递,换句话说他只改变了形参的值,函数调用结束后形参释放,b的值还是没变
    第二个是有什么问题么? 不过是list的用法,list这个接口里面定义了一个size()函数和size的成员变量,
    一旦添加或者删除都会对size进行更新,也就是说size()获得的是list的当前容量