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(); } }

浙公网安备 33010602011771号