java类的加载时机
2018-02-18 19:02
253 查看
研究问题:
构造方法,成员变量的初始化,多态构造函数调用时机?要点:
java 构造函数 成员函数初始化顺序 以及多态的构造函数的调用顺序http://blog.csdn.net/zhanghaotian2011/article/details/9040935
class文件中先执行main方法外部静态代码块,再按照顺序依次执行其他代码块(构造代码块、局部代码块),main方法中类实例化对象时,它并不是首先调用其构造方法而是先是变量的初始化,而且成员的初始化的顺序以成员变量的定义顺序有关,先定义的先初始化,初始化后再调用构造方法。其实成员变量的初始化,在类的所有方法调用之前进行,包括构造方法。
注意:static 的成员比普通的成员变量先初始化。
———————————————–混混哥—————————————————-
类初始化的时机,有且仅有四个:
1、遇到new、getstatic、putstatic、invokestatic这四条字节码指令的时候。
2、使用Java.lang.reflect进行反射调用的时候。
3、当初始化一个类的时候,发现其父类还没有初始化,那么先去初始化它的父类。
4、当虚拟机启动的时候,需要初始化main函数所在的类。
———————————————-友谊哥———————————————–
说到这里,还要说下,静态变量和静态初始化块,普通变量、普通初始化块之间的初始化顺序。看这里
链接中说明了,静态变量和静态初始化块的声明顺序决定了初始化的顺序。
静态变量和静态初始化块的初始化时间::早于::普通变量和普通初始化块::早于::构造方法。
并不是完全父类初始化完毕之后,子类才开始初始化。实际上子类的静态变量和静态初始化块的初始化是在父类的变量、初始化块和构造器初始化之前就完成了。
截图展示区:
1.class Test01{ public Test01(int i){ System.out.println("Test01 of constractor : " + i); } } public class Test02{ private Test01 t1 = new Test01(1); private int n = 10; public Test02(){ System.out.println("Test02 of constructor : " + n); } private Test01 t2 = new Test01(2); public static void main(String[] args){ Test02 test = new Test02(); } }
运行结果:
2.
public class Test03{ private int i1 = printCommon(); private static int i2 = printStatic(); public Test03(){ } public static int printCommon(){ System.out.println("i1 is init!"); return 1; } public static int printStatic(){ System.out.println("i2 is init!"); return 2; } public static void main(String[] args){ Test03 t = new Test03(); } }
运行结果:
3.
public class Test04{ private static Test04 t1 = new Test04(); private static int i1; private static int i2 = 2; public Test04(){ i1++; i2++; } public static void main(String[] args){ Test04 t2 = new Test04(); System.out.println("t2.i1 = " + t2.i1); System.out.println("t2.i2 = " + t2.i2); } }
运行结果:
4.
在类初始化的时候,就规定了,静态语句块中只能访问到定义在静态语句块之前的变量,定义在它之后的,只能赋值,不能访问。
相关文章推荐
- Java类加载的时机
- java类的加载 初始化时机,已经静态代码块的执行时机
- JVM中java类的加载时机
- Java 类加载时机和机制
- java中类的加载和加载时机
- Java 程序加载加载--------类的初始化时机
- java中JVM加载类的时机
- java Class 的加载时机
- Java中 类的加载概述和加载时机
- java加载类创建对象的过程以及静态代码段的执行时机
- java中类加载时机
- Java类加载的时机_4种主动引用会触犯类加载+剩下的被动引用不会触发类的加载
- java面试-深入理解JVM(八)——类加载的时机
- JVM中java类的加载时机
- Java 类加载时机和顺序
- Java 类的加载时机
- Java中类加载的时机
- 深入理解 Java 虚拟机(五)类加载的时机
- java类加载时机与过程
- java Class被加载的时机