class Student
{
public void display(){
ArrayList list=null;
Student student=new Student();
student.test(list);
list.add("aa");
}
public void test(ArrayList list)
{
list =new ArrayList();
}
}
报错.如果把list =new ArrayList();移回display()方法内去实例化即不会出错,谁可以在原理上解释一下.
ArrayList不是引用类型吗?为什么不可以在别的方法里new()呢.
{
public void display(){
ArrayList list=null;
Student student=new Student();
student.test(list);
list.add("aa");
}
public void test(ArrayList list)
{
list =new ArrayList();
}
}
报错.如果把list =new ArrayList();移回display()方法内去实例化即不会出错,谁可以在原理上解释一下.
ArrayList不是引用类型吗?为什么不可以在别的方法里new()呢.
public void display() {
ArrayList<String> list = null;
Student student = new Student();
student.test(list);
list.add("aa");
} public void test(ArrayList<String> list) {
list = new ArrayList<String>();
}
}你报的是 warnning 吧..我加上泛型以后..这程序没有错.
public void test(ArrayList list)
注意这两个list不是一个东西,方法里的list是方法外的list的复制版本。
对方法里的list的=操作不影响方法外的。
test(null)
多个地址指向同一对象
进入test方法后
又有了新地址指向list对象
也就是说执行test时
有两个地址引用list对象
在test中
public void test(ArrayList list) {
list =null;
}
只是把第2个地址指向了null而已
考虑问题的时候画个图
地址 方法或类 对象
a1 X类 A进行连线
class Student
{
public void display(){
ArrayList list=null; //在display中声明的list对象,只在这个方法中有效
Student student=new Student();
student.test(list);
list.add("aa");
}
public void test(ArrayList list) //这里的的list相当于是局部变量,只在test方法中可见。
{
list =new ArrayList(); 这里的list对象就是参数声明的list,跟display中的list是不同的对象}
}
在解释下以免误导别人
我的意思是
在外面ArrayList list=new ArrayList(); public void test(ArrayList list)
{
进入方法后,就有两个地址执行对象了。
}
{
public void display(){
ArrayList list=null; //在display中声明的list对象,只在这个方法中有效
Student student=new Student();
student.test(list);
list.add("aa"); //在这个方法里,list没有new实例化,只是声明了个变量儿也[=null]的add方法,当然要报错的啊。
}
public void test(ArrayList list) //这里的的list相当于是局部变量,只在test方法中可见。
{
list =new ArrayList(); 这里的list对象就是参数声明的list,跟display中的list是不同的对象 }
}
像这种问题画个内存图就很清楚了
左边是栈放形参,右边是堆放对象。
调用test()时,两个引用都指向了空,
new的时候只是让test()中的引用指向了新的对象。
而原来的list并没有指向新对象,依然指向空。
1.首先ArrayList list=null; 这样声明了一个ArrayList 但并没有实例化,也是就说list指向了一个null(空的对象,根本没有分配在heap给它内存);2.当调用方法student.test(ArrayList list); 方法中list是一个形参,它将指向传给它的实参(也就是display()中定义的list)所指向的对象,即null。(此时形参list和实参list指向同一个对象null,相当于两个参数的指向都是空的,根本没有在heap分配给它们内存)3.在方法内部,形参list被实例化了。这时形参指向了一个对象实例(也就是在内存heap得到内存);(此时形参被实例化了,而实参并没有被实例化)4.方法调用结束时,形参被删除。此时曾经分配给形参list的那部分内存没有任何引用指向它,内存为垃圾将会被垃圾回收器收回。而实参此时还是指向null,没有得到内存。
我推荐这一楼的说法呀,在你别一个方法,对ArrayList 的变量赋值时,但的赋值并不给当前调用方法中的参数,加上其赋值效果,也即,在dispaly中,list.add时,list还是null值,这样就会报空指针的错误,可明白呀!如果想进行调用的话,你可以对test方法,进行反回list 的方法,进行在display调用呀!可明白呀!
class Student
{
public void display()
{
ArrayList list=null;
Student student=new Student();
student.test(list);
list.add("aa");
}
public void test(ArrayList list)
{
list =new ArrayList();
}
}为什么我调的没有报错?