水滴石穿-对象实体与对象引用的区别
本文最后更新于:May 13, 2023 pm
积土成山,风雨兴焉;积水成渊,蛟龙生焉;积善成德,而神明自得,圣心备焉。故不积跬步,无以至千里,不积小流无以成江海。齐骥一跃,不能十步,驽马十驾,功不在舍。面对悬崖峭壁,一百年也看不出一条裂缝来,但用斧凿,能进一寸进一寸,能进一尺进一尺,不断积累,飞跃必来,突破随之。
目录
首先需要明白:Java中有堆内存和栈内存之分。而且Java数据类型分为基本数据类型和引用数据类型两大类。
基本数据类型
可以在栈
中直接分配内存;但引用数据类型
是对象引用
在栈
内存中,对象实体
在堆内存
中。栈内存中存放的变量生命周期结束就会释放内存,堆内存中存放的对象实体需要被垃圾回收机制不定时回收。
看代码:
1 |
|
这句代码我们可以理解为:
Object obj 这半句代码,就是在
栈内存
中创建了一个名为obj
的Object类型
的对象引用
,它可以指向 Object 类型的对象实体;new Object() 这半句代码,就是在
堆内存
中创建了一个Object类型
的对象实体
;最后用 “=” 将对象引用 obj 指向对象实体 Object 。
对象引用就是一个变量,有名字,我们可以直接访问,它存储的是一个地址,这个地址指向堆内存中某一个该类型的对象实体;而对象实体没有名字,我们只能通过对象引用来间接访问它。
最后,只有 new 才会创建对象实体,才会在堆内存中开辟新的空间。
然后,如果现在又有一个:
1 |
|
那么,就是又有一个名为 obj2
的 Object类型
的对象引用
,它也指向了 Object类型
的 对象实体
。所以,现在就有两个引用变量都指向了同一个对象实体。
总结
- 一个对象引用可以指向 0 个(不new,直接赋值为
null
)或 1 个(直接new)对象实体。 - 一个对象实体可以有 多个对象引用指向它(至少有一个)。
可能有助于理解的一个概念:
- 多态:表现为父类的引用指向子类的实例。
对象相等和引用相等
- 对象相等一般比较的是内存中存放的
内容
是否相等。 - 引用相等一般比较的是他们指向的内存
地址
是否相等。
2022年6月9日
一个便于理解的图。
本文作者: 墨水记忆
本文链接: https://tothefor.com/DragonOne/5b6a4062.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!