我有基础课:
public class SomeClass {
private List<String> list = new ArrayList<String>();
public List<String> getList() {
return list;
}
public void setList(List<String> list) {
this.list = list;
}
}
在一种方法中,我有以下代码:
private void test(){
SomeClass sc1 = new SomeClass();
sc1.getList().add("a");
sc1.getList().add("b");
SomeClass sc2 = sc1;
System.out.println(sc2.getList().size());
sc1.getList().remove(0);
System.out.println(sc2.getList().size());
sc1=null;
System.out.println(sc2.getList().size());
sc2=null;
System.out.println(sc2.getList().size());
}
我收到 :
2
1个
1个
空指针异常
但是我虽然会收到:
2
1个
空指针异常
NullPointerException(如果捕获到以前的NullPointerException)
如果将引用的对象设置为
null
,则引用链接断开?谢谢您的澄清 最佳答案
如果引用的对象设置为null,则引用链接断开?
没有将对象设置为null的概念。只能将变量设置为null。这个说法:
sc1=null;
...更改
sc1
的值,仅此而已。变量是带有名称的简单存储位置。该存储位置具有一个值,对于类型非原始的变量,该值是一个引用。理解变量的值不是对象是非常重要的。这只是一个参考。
所以这条语句:
SomeClass sc2 = sc1;
只需声明一个新变量(
sc2
),该变量的值与现有变量(sc1
)相同。这两个变量是完全分开的-刚开始它们具有相同的值。我喜欢将变量视为纸。一张纸上可以有一些原始值,例如数字,也可以有房屋地址1。想象一下这些步骤:
造房子
在一张纸上写那个房子的地址(
sc1
)将
sc1
上的文字复制到另一张纸上(sc2
)删除
sc1
上的地址参观地址在
sc2
上的房子这与您在此处执行的操作类似...显然清除
sc1
上的值不会影响房屋或sc2
纸。现在,为什么要看到2然后是1 ...想象这些步骤:
造房子
在一张纸上写那个房子的地址(
sc1
)使用
sc1
查找房子,然后在门口放两个包裹将
sc1
上的文字复制到另一张纸上(sc2
)使用
sc1
查找房子,然后大声喊出找到的包裹数量使用
sc1
查找房屋,然后拿走一个包裹使用
sc2
查找房子,然后大声喊出找到的包裹数量第一次喊2,然后喊1。您没有更改纸片上的值,而是通过添加或删除包裹来更改房屋本身。
1我知道引用不一定是内存地址。这纯粹是出于类比的目的,我发现这是有帮助的。