我有基础课:

 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我知道引用不一定是内存地址。这纯粹是出于类比的目的,我发现这是有帮助的。

09-07 11:05