jvm03、对象的创建

版权声明:本文为博主原创文章,转载请注明出处! https://blog.csdn.net/sinat_33921105/article/details/84110966
小白带你快速了解

对象有这么几种创建方式:

  • new关键字

  • 运用反射手段,调用java.lang.Class 或者 java.lang.reflect.Constructor 类的newInstance()实例方法

  • 调用对象的clone()方法

  • 运用序列化手段,调用java.io.ObjectInputStream 对象的 readObject()方法.

在jvm层面对象的创建是这样滴

在这里插入图片描述

如果你有兴趣,又恰好有时间,接着往下看看呗!

庆哥陪你深入分析

对象的创建?首先,什么是对象?面向对象编程?万物皆对象?算了,比如下面一段代码

Student s = new Student();

以上代码就创建了一个Student对象,这个s就叫做对象引用,后面的new Student()就在堆内存中开辟一块新的内存空间用来存放这个Student对象的实例,而这个内存空间有一个内存地址就存放在java虚拟机栈中的栈帧中的局部变量表。

也就是说在这个局部变量表中开辟一个内存空间存放这个堆中存放这个实例对象的内存空间的内存地址,而在这个局部变量表中新开辟的空间,我们就叫它“s”吧!

以上就是我们最为熟知的创建对象的一种方式,就是通过new这个关键字,不过创建对象的方式可不止这一种,还有这么几种

  • new关键字

  • 运用反射手段,调用java.lang.Class 或者 java.lang.reflect.Constructor 类的newInstance()实例方法

  • 调用对象的clone()方法

  • 运用序列化手段,调用java.io.ObjectInputStream 对象的 readObject()方法.

那么,这几种都是怎么实现对象的创建呢?你知道new是如何创建对象的吗?知道的话,那就可以了,剩下的不急着去研究他们,我们继续往下说对象的创建,也就是说,你要熟知使用new关键字创建对象的方式,然后还知道有其他创建对象的方式就可以了。

接着,我们继续!

我们在之前知道了jvm的内存结构,知道了当你编写一个java源文件之后可以使用javac命令将其编译成class文件,当class文件被加载进内存中,说的粗暴一点,也就是这个class文件会被弄得稀巴烂,然后存放在jvm内存结构中几个不同的区域之中。

对了,你还记得class文件常量池中都是存放些什么玩意吗?答案是字面量和符号引用。

那接下来我们就深入jvm层面去看看这个对象到底是怎么创建的,我们就以这个new关键字创建对象来说。

还拿这段代码来说

Student s = new Student();

下面开始分析啦,注意了

当你写了这么一段代码,在jvm中是如何执行的呢?首先当jvm发现这个new指令的时候就会先对符号引用进行分析,为什么要对符号引用进行分析呢?你可知道在运行时常量池阶段,符号引用会被解析成直接引用,也就是指向对象的那个地址,在此之前也就是这个符号引用可并不是这个地址,而是一个特定的符号,这个符号引用代表着你这个类被加载了,所以如果在class文件常量池中如果没有发现这个符号引用的话,说明了什么呢?

当然是你这个Student类还没有被加载呢?所以就需要进行和这个Student类的加载了,关于类加载,我们这里先不谈。

假设现在类加载完成了,找到了这个符号引用,那么在类的解析阶段就会把这个符号引用解析成直接引用,你想啊,直接引用都出来了,是不是独享就被创建成功了,对象创建在哪呢?

当然是堆啦,所以jvm会在堆中给这个Student对象分配一块内存来存放这几个对象,而这个内存是有一个地址的,就是直接引用啦。

jvm为对象分配完内存之后可没有闲着,紧接着会对分配的内存进行初始化为零值,这里不包括对象头。

等等,什么是对象头,我们常说的这个虚拟机啊一般指的就是HotSpot虚拟机,它实现的对象有这么三个部分组成。

  1. 对象头
  2. 实例字段
  3. 对齐填充字段

那么,如果你要再问这三个是什么玩意,我吧,就不知道怎么回答了,也就说,你就记得在HotSpot中实现的对象包含这三个玩意就行了,不用再往深处去研究了,至少现在不用,ok?

最后,对象的创建还差这么一步就是jvm会调用对象的构造函数,据听说,这个调用会一直追溯到Object类。

至此,对象算是创建成功了,当然,这里面还有很多细节,但是,这些细节你需要都把他们搞明白吗?这个还真的不需要,在学习中要有一个大的前进方向,不要被一些旁枝末节所阻挡,注意,我可没有说这些旁枝末节不重要,最近换了这个桌面

在这里插入图片描述

嗯,不懂啥意思!就感觉挺好的。

到这里吧,我觉得我的分析有一张图就更加完美了,你等一会,我去画个图去。

画图中。。。请稍后

在这里插入图片描述

怎么,这图还可以的,就是有点不正经!

下集预告:

类的加载?什么玩意,大家一起看看呗!

猜你喜欢

转载自blog.csdn.net/sinat_33921105/article/details/84110966