java中成员变量代码块构造函数运行顺序

Posted jhcelue

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java中成员变量代码块构造函数运行顺序相关的知识,希望对你有一定的参考价值。

1、java虚拟机执行程序,首先须要装载类,安装现装载父类,初始化父类的静态代码块和静态成员变量
再load子类。

初始化子类静态代码块和成员变量
2、load完成父类与子类后,从main函数入口运行程序。先输出,接着new实例化Beetle类,则先实例化父类Insect,实例化父类时。先初始化非静态成员变量和非静态代码块,接着运行父类构造方法
再实例化子类,实例化子类时,先初始化非静态成员变量和非静态代码块,接着运行子类构造方法。



package it.xiangnan.test;

public class Beetle extends Insect {
    private int k = printInit("Beetle.k initialized");

    public Beetle() {
        System.out.println("k=" + k);
        System.out.println("j=" + j);
    }

    private static int x2 = printInit("static Beetle.x2 initialized");

    public static void main(String[] args) {
        System.out.println("Beetle constructor");
        Beetle b = new Beetle();
    }

}

class Insect {
    private int i = 9;
    protected int j;

    Insect() {
        System.out.println("i=" + i + ",j=" + j);
        j = 39;
    }
    
    private static int x1 = printInit("static Insect.x1 intialized");

    static int printInit(String s) {
        System.out.println(s);
        return 47;
    }
}


函数从main处运行
Beetle有父类Insect。先初始化父类的静态成员变量x1,再初始化Beelte类静态成员变量x2
转而从main处运行。输出Beetle constructor,因为紧接着实例化Bettle类。该类有父类Insect,则先运行父类构造函数。在运行子类构造函数
static Insect.x1 initialized     1、父类Insect静态成员变量初始化值为47
static Beetle.x2 initialized     2、Beetle类的静态成员变量x2初始化值为47
Beetle constructor               3、输出
i=9,j=0                          4、运行Beetle的父类Insect的默认构造函数
Beetle.k initialized             5、运行Beetle类的默认构造函数,输出k值之前,调用printInit方法输出该句话。并初始化k值为47
k=47                             6、分别输出k、j的值
j=39
























































以上是关于java中成员变量代码块构造函数运行顺序的主要内容,如果未能解决你的问题,请参考以下文章

(Java)类实例化过程中,父类和子类的静态变量静态代码块成员变量构造函数的执行顺序是什么?

java中静态代码块,非静态代码块,构造函数执行顺序

请问java构造函数如何初始化成员变量的啊?

Java对象实例化顺序

java类创建时里面成员执行的先后顺序

java中父类和子类初始化顺序