1.当虚拟机启动,先初始化main方法所在的类
public class Text { static { System.out.println("Main类被加载"); } public static void main(String[] args) { } }
2.当初始化一个类,如果其父类没有被初始化,则会先初始化它父类
public class Text { static { System.out.println("Main类被加载"); } public static void main(String[] args) { Son son = new Son(); } } class Father{ static { System.out.println("父类被加载"); } } class Son extends Father{ static { System.out.println("子类被加载"); } }
3.调用类的静态成员(处final常量)和静态方法
public class Text { static { System.out.println("Main类被加载"); } public static void text1(){ int a =0; } public static void main(String[] args) { Text.text1(); } }
4.使用java.lang.reflect包的方法对类进行反射调用
public class Text { static { System.out.println("Main类被加载"); } public static void main(String[] args) throws ClassNotFoundException { Class.forName("cn.itasc.jiyi.Father"); } } class Father{ static { System.out.println("父类被加载"); } }
5.new一个类的对象
public class Text { static { System.out.println("Main类被加载"); } public static void main(String[] args) throws ClassNotFoundException { Text s = new Text(); } }类的被动引用(不会发生类的初始化)
1.当访问一个静态域时,只有真正声明这个域的类才会被初始化。如:当通过子类引用父类的静态变量,不会导致子类初始化
2.通过数组定义类引用,不会触发此类的初始化
3引用常量不会触发此类的初始化(常量在链接阶段就存入调用类的常量池中了)
public class Text { static { System.out.println("Main类被加载"); } public static void main(String[] args) throws ClassNotFoundException { System.out.println(Son.a); System.out.println("_____________________"); Son[] sons =new Son[5]; System.out.println("_____________________"); System.out.println(Son.h); } } class Father{ static int a =1; static { System.out.println("父类被加载了"); } } class Son extends Father{ static { System.out.println("子类被加载"); } static final int h =2; }
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)