用关键字new
进行对象的创建,几乎是写代码时最常用的操作之一了,比如:
通过new
的方式,我们可以调用类的无参或者有参构造方法来实例化出一个对象。
表面上看,简简单单new
一下对象就有了,但面试时如果仅仅答到这一层,大概率会扑街,因为比这个更重要的是new
对象时的原理和流程,因为JVM
这个牵线红娘在背后默默地帮我们做了很多工作。
-
首先,当我们
new
一个对象时,比如Dog dog = new Dog()
,JVM
首先就回去检查dog
这个符号引用所代表的类是否已经被加载过,如果没有就要执行对应类的加载过程; -
声明类型引用很简单,比如
Dog dog = new Dog()
就会声明一个Dog
类型的引用dog
; -
第一步类加载完成以后,对象所需的内存大小其实就已经确定下来了,接下来
JVM
就会在堆上为对象分配内存; -
所谓的属性“
0
”值初始化非常好理解,即为实例化对象的各个属性赋上默认初始化“0”值,比如int的初始化0值就是0,而一个对象的初始化0值就是null; -
接下来JVM会进行对象头的设置,这里面就主要包括对象的运行时数据(比如Hash码、分代年龄、锁状态标志、锁指针、偏向线程ID、偏向时间戳等)以及类型指针(JVM通过该类型指针来确定该对象是哪个类的实例);
-
属性的显示初始化也好理解,比如定义一个类的时候,针对某个属性字段手动的赋值,如:
private String name = "helloworld";
就在这时候给初始化上; -
最后是调用类的构造方法来进行进行构造方法内描述的初始化动作。
应该说,经过了这一系列步骤,一个新的可用对象方才得以诞生。