java类加载过程及初始化顺序

类加载过程(参考 深入理解java虚拟机 7.3节内容)

1.加载(通过类的全限定名获取二进制字节流、二进制字节流按一定格式存到方法区中、内存中生成类的java.lang.Class对象、)
2 连接( 验证:确保Class文件中字节流对虚拟机是安全的、准备:为静态变量分配内存到方法区设初始值为零值、解析:不深究,可能在初始化之后进行解析以支持动态绑定)
3. 初始化(执行静态变量和静态语句块相关操作)

/**
*初始化顺序:先静态语句,后构造方法


父类静态代变量、
父类静态代码块、
子类静态变量、
子类静态代码块、
父类非静态变量(父类实例成员变量)、
父类构造函数、
子类非静态变量(子类实例成员变量)、
子类构造函数。

执行结果:

super.static属性2        //静态变量有值说明static变量在static块之前执行,
super-static{}			//静态块只能访问定义在其前面的静态变量。
child.static属性4      
child-static{}
super-a  1      		//非静态属性有值说明初始化在构造方法之前
child-c  3

*/

	public class initializeOrder {
	
		public static void main(String[] args) {
			new Child();
		}
	
	}
	
	class Super{
		int a =1;
		static int b=2;
		static {
			System.out.println("super.static属性"+b);
			System.out.println("super-static{}");
		}
		public Super() {
			System.out.println("super-a  "+a);
		}
	}
	
	class Child extends Super{
		int c = 3;
		static int d=4;
		static {
			System.out.println("child.static属性"+d);
			System.out.println("child-static{}");
		}
		public Child() {
			System.out.println("child-c  "+c);
		}
	}

你可能感兴趣的:(java基础,JVM)