gpt4 book ai didi

Java 和引用资料

转载 作者:行者123 更新时间:2023-12-01 06:28:08 26 4
gpt4 key购买 nike

我有基础课:

 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,则引用链接会损坏?谢谢您的澄清

最佳答案

If a referenced object is set to null, the reference link is broken ?

不存在将对象设置为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找到房子,并喊出你找到了多少个地 block

第一次你会喊 2,然后你会喊 1。你并没有改变纸上的值 - 你只是通过添加或删除地 block 来改变房子本身。

<小时/>

1 我知道引用不一定是内存地址。这纯粹是为了进行类比,我发现这很有帮助。

关于Java 和引用资料,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14485699/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com