MST

星途 面试题库

面试题:Java构造方法与对象初始化过程及内存分配

详细描述Java对象从创建到初始化完成的整个过程中,构造方法是如何参与的,以及涉及到的内存分配情况,包括堆内存、栈内存等。
18.5万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

1. Java对象创建及构造方法参与过程

  1. 类加载检查:当使用new关键字创建对象时,JVM首先检查该类是否已经被加载。如果没有加载,会进行类加载过程,包括加载、验证、准备、解析和初始化阶段。
  2. 分配内存:在堆内存中为对象分配空间。对象所需的内存大小在类加载完成后就已经确定。
  3. 初始化零值:为分配的内存空间中的实例变量赋予默认初始值(如整数类型为0,布尔类型为false,引用类型为null等)。此时对象处于“半初始化”状态。
  4. 执行实例初始化
    • 按照实例变量声明顺序执行实例变量的初始化语句和实例初始化块。
    • 调用构造方法。构造方法首先会隐式调用父类的构造方法(如果没有显式调用),通过super关键字。父类构造方法执行完成后,才会执行子类构造方法中的代码。构造方法中可以对实例变量进行进一步的初始化和其他业务逻辑操作,至此对象初始化完成。

2. 内存分配情况

  1. 堆内存
    • 用于存储对象实例。对象的实例变量和对象本身都存储在堆内存中。例如,创建一个Person对象,Person对象的所有成员变量(如nameage等)都会在堆内存中分配空间。
    • 堆内存是共享的,多个线程可能会同时访问堆内存中的对象。
  2. 栈内存
    • 方法调用时,会在栈中创建一个栈帧。当执行构造方法时,构造方法对应的栈帧会被压入栈中。栈帧中存储了局部变量表(包括构造方法的参数)、操作数栈、动态链接等信息。
    • 栈帧的生命周期与方法的调用和结束相关,当构造方法执行完毕,对应的栈帧会从栈中弹出。例如,在构造方法public Person(String name, int age)中,nameage参数会存储在栈帧的局部变量表中。