面试题答案
一键面试1. Java对象创建及构造方法参与过程
- 类加载检查:当使用
new
关键字创建对象时,JVM首先检查该类是否已经被加载。如果没有加载,会进行类加载过程,包括加载、验证、准备、解析和初始化阶段。 - 分配内存:在堆内存中为对象分配空间。对象所需的内存大小在类加载完成后就已经确定。
- 初始化零值:为分配的内存空间中的实例变量赋予默认初始值(如整数类型为0,布尔类型为false,引用类型为null等)。此时对象处于“半初始化”状态。
- 执行实例初始化:
- 按照实例变量声明顺序执行实例变量的初始化语句和实例初始化块。
- 调用构造方法。构造方法首先会隐式调用父类的构造方法(如果没有显式调用),通过
super
关键字。父类构造方法执行完成后,才会执行子类构造方法中的代码。构造方法中可以对实例变量进行进一步的初始化和其他业务逻辑操作,至此对象初始化完成。
2. 内存分配情况
- 堆内存:
- 用于存储对象实例。对象的实例变量和对象本身都存储在堆内存中。例如,创建一个
Person
对象,Person
对象的所有成员变量(如name
、age
等)都会在堆内存中分配空间。 - 堆内存是共享的,多个线程可能会同时访问堆内存中的对象。
- 用于存储对象实例。对象的实例变量和对象本身都存储在堆内存中。例如,创建一个
- 栈内存:
- 方法调用时,会在栈中创建一个栈帧。当执行构造方法时,构造方法对应的栈帧会被压入栈中。栈帧中存储了局部变量表(包括构造方法的参数)、操作数栈、动态链接等信息。
- 栈帧的生命周期与方法的调用和结束相关,当构造方法执行完毕,对应的栈帧会从栈中弹出。例如,在构造方法
public Person(String name, int age)
中,name
和age
参数会存储在栈帧的局部变量表中。