Java创建对象时静态代码块、动态代码块、构造函数、初始化的顺序及方法区、堆、栈的变化

Reyco郭-Spring4-010-SpringIoc第一个程序-对象创建的复习

package com;

public class Test {
    public int k = 999;
    static {
        System.out.println("执行静态块");
        //System.out.println("k = "+k);    //  编译错误
    }

    {
        System.out.println("执行动态块");
        System.out.println("k = "+k);      //  输入99
    }

    public Test() {
        System.out.println("执行构建方法");
        System.out.println("k = "+k);     //  输入99
    }

    public static void main(String args[]) {
        Test t = new Test();
    }
}
  1. 从上面的执行结果得出的执行顺序:
    1. 静态代码块
    2. 动态代码块
    3. 无参构造函数
  2. 问题1:什么是创建一个对象(java类的实例)?jvm在堆中给新对象分配内存空间和对对象进行初始化,哪个先哪个后?
    1. 答:创建一个对象(java类的实例)分为2步:
      1. 第1步:就是在堆内存中给它分配内存空间。
      2. 第2步:对对象进行初始化。
  3. 问题2:jvm在堆内存中给新对象分配内存空间,具体分配内存空间给什么东西?
    1. 答:在堆中给对象分配内存空间,其实就是给对象的成员变量分配堆内存空间。如上面的Test.java类在创建对象时,在堆内存中分配内存空间就是给成员变量 int k = 99分配的那个空间(12个字节)。
  4. 问题3:什么叫对象初始化完毕?
    1. 答:如果新对象中的所有成员变量都初始化完了,才说明整个对象初始化完毕。
  5. 问题4:开始执行无参构造函数的前,JVM给是否已经给这个新对象分配堆中的堆内存空间?开始执行无参构造函数的前,新对象的初始化完毕了没有?当无参构造器执行的时候,对象创建了没有?是执行无参构造器的时候,对象已经创建好了?还是执行无参构造器的过程中创建对象的?还是无参构造器的方法执行完毕以后对象才创建好?
    1. 答:执行构造器的前,jvm已经在堆内存中给此新对象分配堆内存空间了,并且jvm也已经给新对象初始化完毕了。
    2. 证明:因为创建对象的执行顺序是静态代码块 》动态代码块 》无参构造函数,而且在执行动态代码块时输出了"k = 99",所以说明在执行无参构造函数之前已经创建好对象(堆内存中给它分配内存空间,且对对象进行初始化)完毕了。
  6. 问题5:一个空类(没有任何成员变量,如Object obj = new Object())在创建对象时,jvm会在堆内存中给此新对象分配多少个字节知道吗?1个没有成员变量的对象在堆内存中占有几个字节?
    1. 答:8个字节。因为所有的类都是继承自Object.java类,而Object.java类的对象占用8个字节。但注意,Object.java类中没有成员变量。
  7. 问题6:有成员变量的对象在堆内存中占用多少个字节?
    1. 答:8 + 此对象在堆内存中占用的字节数。
  8. 问题7:上面的Test.java类,在创建对象时jvm在堆内存中给对象分配多少字节的堆内存空间?
    1. 答:12个字节。因为继承的new Object()占用8个字节,而Test.java本身由于int k = 99;会被分配4个字节的堆内存空间,所以加起来一共12个字节。
  9. 问题9:引用型的变量放的是什么东西?
    1. 答:引用型的变量里面放的是地址,此地址指向一个对象。
  10. 问题9:引用型的成员变量占用几个字节?
    1. 答:不一定,说不准。因为占用的字节数和你使用的机器的位数是有关系的,和虚拟空间有关系,所以你看哪个资料都不能(会)确切告诉你引用型的变量占用多少个字节。一般就是4个字节或者8个字节,它不确定,这个跟机器有关系,跟你机器的寻址空间有关系(因为引用型的变量里面放的是一个地址,所以跟寻址空间有关系)。
  11. 问题10:堆、方法区、栈中分别放的是什么东西?栈_堆_方法区_栈帧_程序执行的内存变化过程 - 知乎

      1. 成员变量
    1. 方法区
      1. 静态变量
    2. 方法栈帧
      1. 方法中的局部变量
  12. 阿里巴巴笔试题:Java静态代码块、静态函数、动态代码块、构造函数等的执行顺序

猜你喜欢

转载自blog.csdn.net/aiwokache/article/details/129074405