水滴石穿-对象实体与对象引用的区别

本文最后更新于:May 13, 2023 pm

积土成山,风雨兴焉;积水成渊,蛟龙生焉;积善成德,而神明自得,圣心备焉。故不积跬步,无以至千里,不积小流无以成江海。齐骥一跃,不能十步,驽马十驾,功不在舍。面对悬崖峭壁,一百年也看不出一条裂缝来,但用斧凿,能进一寸进一寸,能进一尺进一尺,不断积累,飞跃必来,突破随之。

目录

首先需要明白:Java中有堆内存和栈内存之分。而且Java数据类型分为基本数据类型和引用数据类型两大类。

基本数据类型可以在中直接分配内存;但引用数据类型对象引用内存中,对象实体堆内存中。栈内存中存放的变量生命周期结束就会释放内存,堆内存中存放的对象实体需要被垃圾回收机制不定时回收。

看代码:

1
Object obj = new Object();

这句代码我们可以理解为:

  • Object obj 这半句代码,就是在栈内存中创建了一个名为 obj Object类型对象引用,它可以指向 Object 类型的对象实体;

  • new Object() 这半句代码,就是在堆内存中创建了一个 Object类型对象实体

  • 最后用 “=” 将对象引用 obj 指向对象实体 Object 。

对象引用就是一个变量,有名字,我们可以直接访问,它存储的是一个地址,这个地址指向堆内存中某一个该类型的对象实体;而对象实体没有名字,我们只能通过对象引用来间接访问它。

最后,只有 new 才会创建对象实体,才会在堆内存中开辟新的空间。

然后,如果现在又有一个:

1
Object obj2 = new Object();

那么,就是又有一个名为 obj2 Object类型对象引用,它也指向了 Object类型对象实体。所以,现在就有两个引用变量都指向了同一个对象实体。

总结

  • 一个对象引用可以指向 0 个(不new,直接赋值为null)或 1 个(直接new)对象实体。
  • 一个对象实体可以有 多个对象引用指向它(至少有一个)。

可能有助于理解的一个概念:

  • 多态:表现为父类的引用指向子类的实例。

对象相等和引用相等

  • 对象相等一般比较的是内存中存放的内容是否相等。
  • 引用相等一般比较的是他们指向的内存地址是否相等。

2022年6月9日

一个便于理解的图。