关于java中类成员的加载顺序

目录

一、单个类的加载顺序

二、代码

三、输出结果

三、对输出结果的解释 

四、类加载的内存图:

一、单个类的加载顺序

1、加载是类

2、产生自己的静态空间 静态属性 静态方法 静态块 

执行静态块

3、在堆内存中开辟对象空间

4、加载类的非静态成员 普通属性 普通方法 普通块 

执行普通块 执行构造方法

5、将对象空间的地址引用交给   变量来存储

二、代码



public class Demo {

    private String demo = "普通属性";

    private static String demoStatic = "静态属性";


    public Demo() {

        System.out.println("这是Demo无参构造方法");
    }

    {
        this.test();
        System.out.println("这是Demo普通的块");
    }

    static {
        testStatic();
        System.out.println("这是Demo的静态块");
    }

    public static void testStatic() {
        System.out.println(getDemoStatic());
        System.out.println("这是Demo的静态方法");
    }

    public void test() {
        System.out.println(getDemo());
        System.out.println("这是Demo的普通方法");
    }

    public String getDemo() {
        return demo;
    }

    public static String getDemoStatic() {
        return demoStatic;
    }

}
public class TestMain {

    public static void main(String[] args){

        Demo p = new Demo();

    }
}

三、输出结果

三、对输出结果的解释 

在静态方法中调用了静态属性,在静态块中调用了静态方法 

都能如愿以偿的输出说明了在静态方法之前就加载了属性   

在加载静态方法之前就加载了静态属性------->静态属性产生的比静态方法早

在加载静态块之前就加载了静态方法------>静态方法的产生比静态块早

得出结论:

早------>晚

静态属性    静态方法    静态块

 在普通方法中调用了普通属性,在普通块中调用了普通方法 

都能如愿以偿的输出说明了在普通方法之前就加载了属性   

在加载普通方法之前就加载了普通属性------->普通属性产生的比普通方法早

在加载普通块之前就加载了普通方法------>普通方法的产生比普通块早

最后输出了默认的构造方法

得出结论:

早------>晚

普通属性    普通方法    普通块   默认的构造方法

四、类加载的内存图:

对象的创建是在堆内存中

变量是在栈内存中,Demo  d = new Demo();

Demo  d =    的意思是将对象空间的地址引用交给   变量来存储


版权声明:本文为qq_58022841原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。