学习Java的引用类型时的一点心得二之引用变量

上篇我写到类的静态成员属性(域、变量)是所有此类对象的共同特性,为此类所有的对象所共享;对象的成员属性为每个用此类创建出的对象所独有,不为其它对象所有。

那在这里,我们多次提到一个词——对象。首先在java中,对象是什么呢?想在我所读过的所有的书中都说过这样一句话:一切皆对象。

我在这里真有点不知所措,什么叫:一切皆对象。这对于我来说,到现在也是感到颇为无奈。它就像是道可道,非常道和什么佛曰:不可说一样呀,让人都一点头脑都摸不到。

由上面的一段话,实际上也就暴露出:我对什么是对象还是一脑子的疑惑。但就算是有疑惑,我也还是有一点自己的感觉和体悟的。就我的理解,什么是对象呢?简单点说是用new操作符去操作类文件的结果就是一个对象。那更详细和具体一点的呢?那就是能去用数据和语言描述的事情和物体(事、物)就是对象,这是我们的类文件就是对象的文字描述。

因为心中存在关于类的对象在JVM是以什么样的形态存在的这样的困惑,还有,为什么同一类的不同的对象可以拥有相同的成员,是不是在对象创建时,为每一个对象都复制了一个成员名列表给这些对象,为什么我们仅仅通过对象的饮用型变量就可以操作对象的可见成员等等这些问题就是我在学习引用变量时,所出现的困惑,但到现在我也没有得到一个我所能满意的解答。

我一直希望能有一个对类的对象在内存中的形态以及它的整体活动状态的一个形象的、生动的解答,更期望能有一个直观的图形或者动画的演示,若能把我的这些问题都能拟人化,让它们动画式的展示在面前就更好了。可以一直就是找不到这样一个资源,所以也就只能退而求其次了。

下面是我在其他博客中找到的一些我认为对我比较有帮助的,还算直观的关于对象在JVM的形态的解答:

https://www.cnblogs.com/NeverCtrl-C/p/6486156.html
new 创建对象过程  此图出自: https://www.cnblogs.com/NeverCtrl-C/p/6486156.html

 此篇博客详细介绍了对象的声明周期:

对象的生命周期

  1.1 使用new运算符创建对象

    1.1.1 Java虚拟机先检查类是否加载, 如果没有加载就加载类信息到方法区

    1.1.2 根据类信息中的属性定义在堆内存中开辟存储空间, 并且每个属性有默认值

    1.1.3 调用构造器, 执行构造器中属性初始化过程, 构造器结束时候, 释放构造器中全部的局部变量

    1.1.4 new运算返回对象的引用(即:对象在堆中的地址)

  1.2 利用引用操作使用对象 - 使用引用操作对象: 访问对象的属性和方法. - 可以反复更改对象的属性状态.

  1.3 对象在不被引用时候被垃圾回收器回收 - 当一个对象不再被引用时候, 对象就称为内存垃圾. 内存垃圾在适当时候被垃圾回收器回收.

  1.4 注意

    1.4.1 对象生存期中构造器只能执行一次. 在对象生存期间, 可以反复调用其方法, 反复访问其属性. 

    1.4.2 对象的属性随着对象在堆中分配.

在配合另一篇博客来加深一下理解:

https://www.cnblogs.com/jimoer/p/8849025.html
此图出自: https://www.cnblogs.com/jimoer/p/8849025.html

这张图更加简明的展示了对象与类文件的关系,更直观的说明了对象是如何操作对象的可见的成员(类的成员域和成员方法)的。

 

上面说了那么多,都是在说类的对象的,好像与我的题目所要表达的主题似乎有些偏题了。但就我的理解,要向理解引用变量(对象的标识符、对象的指针变量),那就必然有对对象有一个差强人意的理解不是。不然,我们在不不了解对象的运行状态的情况下来去学习引用变量,那不是有点空中楼阁或只知其然,而不知其所然的感觉吗?我的思路就是有引用变量,为什么要有引用变量,以及引用变量如何作用于对象的,引用变量作用于对象后,对象又引起了哪些变化。我的这篇博客,可以说是对这个思路的一个逆向说明。

上面说了对象在内存中的存在形态,下面就说一说引用型变量是如何标识它所引用的对象的。我们知道引用变量存在于stack中,通过上面的两幅图片,我们也能看出,引用变量指向了它所引用的对象。在Java教材中,我们也得知:引用变量存储的是对象在heap中的首地址。

因此,当我们通过引用变量取访问对象时,JVM就会通过此地址在heap中找到要访问的对象。所以,我们就可以直接认为这个引用了该对象的变量就相当于该对象了,因为,我们每次去使用该变量时,JVM就会自动的找寻它所引用的对象。这就像我们的名字一样,当我们说一个人的名字,我们就会自然而然的与此人做唯一性的关联,不然我们说的这个名字还有什么意义呢?实际是对于JVM与引用变量的性质也是如此,若我们对JVM说一个没有引用对象的引用型变量,对于JVM来说,此变量就是无意义的,那么JVM怎么表示它无意义呢?就是给这个变量一个null值。

好了,现在,我们知道了,引用变量是对象的标志,在代码中使用因为变量,在执行时,JVM便会自动的寻找到此变量所指向的对象。那后面的通过此变量来使用对象的可见的成员,此时我想便也是顺理成章了呢。

感想:在学习这个内容时,让我知道了有些问题间的包含性是很强的,当想理解被包含在内部的问题时,我们就要对包含此问题的外部问题有所了解,不然,若只是针对此问题,那便是有些费力不讨好,花费了很长时间也还有可能是对问题一知半解,若理解有偏差,这也许可以用一句话道出其意:失之毫厘谬以千里。

只是在这里,我还有两个问题没有被解决,那就是对象如何找到我们所要使用的成员的?JVM是怎样按逻辑地址寻址的?在此写出我的这个问题,也是希望大家能给我一个指导,在此先做出感谢!

猜你喜欢

转载自blog.csdn.net/Anglebeat/article/details/83247596