各位高手,下面这个程序调用了test2()方法后在打印list的长度应该是报错的?因为我在test2()中将list设置成null了,但是实际上为什么能通过编译并且能运行呢?结果是0和1import java.util.*;
public class TestClass
{
public static void main(String[] args)
{
List list = new ArrayList();
test2(list);
System.out.println(list.size());
test3(list);
System.out.println(list.size());
//List list1 = null;
//System.out.println(list1.size());
} public static void test2(List list)
{
list = null;
} public static void test3(List list)
{
list.add("aaaa");
}
}
public class TestClass
{
public static void main(String[] args)
{
List list = new ArrayList();
test2(list);
System.out.println(list.size());
test3(list);
System.out.println(list.size());
//List list1 = null;
//System.out.println(list1.size());
} public static void test2(List list)
{
list = null;
} public static void test3(List list)
{
list.add("aaaa");
}
}
也就是说 List list = new ArrayList(); -------------- No1 public static void test2(List list)
{
list = null; -------------- No2
}No2的list只是No1的list的一个copy,它们指向的对象是一样的,但是通过list=null赋值只是改变了No2的list,
No1的list没有变,但是通过list.add("aaaa"); 是改变了No1的list和No2的list指向的对象的内容.如果对Java理解不深的话,尽量避免这种编程方式.
你只是打印List的长度,肯定不会报NullPointerException,如果是获取其中的值,例如list.get(0)就会报这个错误了
java里面所有方法,如果是对象的话,穿过去的是对象的引用地址, test2(list);
你把 main 里面list指向的对象地址传过去了 public static void test2(List list)
{
// 这里的 list 是一个本地变量,此list非main里面的list,不过他们指向了同一个对象
list = null;
// 你把本地变量指向了null, 并不会影响main里面的 list 哦
} 而 public static void test3(List list)
{
list.add("aaaa");
// 此操作直接对list指向的对象进行了操作,因为main里面的list指向同一个对象,所以在那面能访问到
} 总结:java传递对象类似于C里面的内存指针哦。2个变量指向了同一个地址。test是修改变量自己的指针,test3是修改被指向地址的那块内存的内容