..

java#类的实例化顺序

关于类的实例化,不用弄的那么细致,这里只说单一类,没有其他父类(排除Obejct)的情况。
要实例化一个类,需要加载class文件到jvm并且验证通过了是安全的字节码文件。

初始化大致上是按照如下步骤:

1.按代码从上到下的顺序进行的实例化操作
2.静态变量和静态代码块是同一优先级,在类加载的时候就会执行,哪怕没有实例化对象(就是包含main函数的类)也会执行,且只执行一次
----------------------实例化与否分界线--------------------------------------------------------------------------
3.实例化类的时候,普通代码块和普通变量赋值是同一优先级,按在代码中出现的顺序进行初始化,每次实例化对象都会执行
-----------------------其他分割线-----------------------------------------------------------------------------
4.嵌套类只有在用到的时候才会被加载到jvm,被加载之后才会按照静态变量/静态代码块相同优先级被初始化
5.内部类只有在用到的时候才会被加载,内部类没有静态代码块~

 

 


 

 

import java.util.Random;

public class ClassInitTest {

    private int a = getIntNormal();
    private static int b = getIntStatic();

    {
        System.out.println("普通代码块1" + new Random().nextInt());
    }

    static {
        System.out.println("静态代码块代码块1" + new Random().nextInt());
    }

    class Inner{
        {
            System.out.println("Inner class............");
        }
    }

    private static int c = getIntStatic();

    static {
        System.out.println("静态代码块代码块2" + new Random().nextInt());
    }

    private int d = getIntNormal();

    {
        System.out.println("普通代码块2" + new Random().nextInt());
    }

    private static int getIntStatic() {
        System.out.println("hello getIntStatic()");
        return new Random().nextInt();
    }

    private int getIntNormal() {
        System.out.println("hello getIntNormal()");
        return new Random().nextInt();
    }

    public static void main(String[] args) {

        System.out.println("\n\nmain方法执行,接下来main睡5秒后开始创建实例\n\n");

        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        new ClassInitTest();
        new ClassInitTest();

    }
}

 

 

 

posted @ 2019-09-03 17:26  罗浩楠  阅读(532)  评论(0)    收藏  举报
..