Java中的引用类型是按引用还是按值分配?

据我所知,在Java中引用类型是按值分配的,但我无法理解为什么下面的代码会执行它的操作。考虑以下代码:


Integer num = new Integer(11);

List<Integer> arr = new ArrayList<>();

arr.add(num);

List arr2 = arr;

arr = null;

System.out.println(arr2);

我们创建一个包含一个元素的 ArrayList,然后创建第二个列表并将其分配给第一个列表。据我了解,第二个列表仅指向与第一个列表相同的内存位置,因此我对第一个列表所做的任何更改都将应用于第二个列表。如果我将第一个列表设置为空,那么第二个列表也应该变为空。为什么控制台仍然记录 11 而不是 null?


幕布斯6054654
浏览 87回答 2
2回答

喵喵时光机

这就是后台发生的事情。我会尝试将其形象化,以便于理解。创建整数对象:Integer num = new Integer(11);num --> @num493857 (some reference not real of course)@num493857 --> ------&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;| 11 |&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;------创建数组列表:List<Integer> arr = new ArrayList<>();arr --> @arr7686@arr7686 --> [] (empty list)将 num 添加到 Arraylist:arr.add(num);arr --> @arr7686 --> [@num493857] // @num493857 has 11 in it&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;^&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;|&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; num设置 arr2 = arr:List arr2 = arr;arr --> @arr7686 --> [@num493857]&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;^&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;^&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;|&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;|&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; arr2&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; num设置 arr = null:arr = nullarr --> null&nbsp; &nbsp; &nbsp; &nbsp; @arr7686 --> [@num493857]&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;^&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;^&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;|&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;|&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; arr2&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; num打印arr2:System.out.println(arr2);This prints whatever is in the list that is 11.

LEATH

如果您将 Java 变量与C 中的引用而不是指针进行比较,就会更容易理解。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java