Java类的加载顺序
1、虚拟机首次加载类时,会对静态初始块,静态对象,静态方法进行一次初始化。
2、只有调用new方法时才会创建实例。
3、类实例创建过程:首先执行父类初始化块部分,然后是父类的构造方法。然后是子类的初始化快和构造方法。
4、类实例销毁时,先销毁子类部分,在销毁父类部分。
public class Test { public enum TT{ a(2), b(3); private TT(int c){ System.out.println(c); } private int s; public static final String ss="b"; } static{ System.out.println(1); System.out.println(TT.a);; System.out.println(4); } public static void main(String[] args) { new Test(); } }
打印内容:
1
2
3
a
4
实例化对象的过程:
1.检查类是否加载,如果没有加载就加载这个类,要加载所有父类;
懒式加载(按需加载):如果第一次用到加载,只加载一下.通过ClassPath制定的路径寻找类文件(.class) 加载以后是一个对象,类型是class.获得这个类对象:student.class-->class实例
2.在内存堆中分配对象空间.递归分配所有父类和子类属性空间.先父类型再子类型,属性默认自动初始化.自动初始化为"0"值;
3.进行属性的赋值;
4.递归调用父类构造器.(默认调用父类无参构造器);
5.调用本类构造器
Java编程思想上是这么描述的:
1、当某个型别为Dog(这里用Dog表示一个类)的对象首次被产生出来,或是当class Dog的static函数或static数据成员首次被访问,java直译器必须查找环境变量classpath所指定的位置,找出Dog.class。
2、一旦Dog.class 被装载,他的所有static动作就会被执行起来。因此他的static初始化动作只会发生一次,就是在class对象首次被装载时。
3、当你new Dog()时,构造过程会先为Dog对象在heap上分配足够的存储空间。
4、这块存储空间会被清为0,并自动将Dog对象内所有隶属基本型别的数据设为缺省值(对数字来说是0),并将references设为null。
5、执行所有出现于数据定义处的初始化动作。
6、执行构造函数。
public class TestInstanceInit { public static int n = 0;// 静态变量 static {// 这是静态初始化块 print(); System.out.println("this is static block"); } {// 实例初始化块 System.out.println(n); } public TestInstanceInit() {// 构造方法 System.out.println("this is TestInstanceInit's constructor~"); }
public static void print() {// 静态方法 System.out.println("this is static method~"); System.out.println(n); n += 1; } public static void main(String[] args) { new TestInstanceInit(); }
}
控制台输出结果:
this is static method~
0
this is static block
1
this is TestInstanceInit's constructor~
如果有一个变量怎么处理呢:
public class TestInstanceInit { // 静态变量 public static String staticField = "静态变量"; // 变量 public String field = "变量"; // 静态初始化块 static { System.out.println(staticField); System.out.println("静态初始化块"); } // 初始化块 { System.out.println(field); System.out.println("初始化块"); } // 构造器 public TestInstanceInit() { System.out.println("构造器"); } public static void main(String[] args) { new TestInstanceInit(); } }
控制台输出结果:
静态变量
静态初始化块
变量
初始化块
构造器