1 public class TestClassLoader1 { 2 public static void main(String[] args) { 3 4 Test test = new Test(); 5 } 6 } 7 class Test{ 8 9 static{ 10 m=200; 11 } 12 13 static int m=100; 14 static{ 15 m=250; 16 System.out.println(m); 17 System.out.println("静态代码块执行完毕。"); 18 } 19 20 public Test(){ 21 m=400; 22 System.out.println(m); 23 System.out.println("构造方法。"); 24 } 25 }
1.创建一个对象有三个阶段:加载,链接,初始化。以上示例说明:静态变量在加载的时候被加载进内存,链接时给静态变量赋初始值为0,在初始化阶段有JVM调用clinit()方法来按顺序合并静态代码块。
2.测试什么情况下类会被加载:new 对象;调用父类的静态变量;
1 public class Test3 { 2 public static void main(String[] args) throws ClassNotFoundException { 3 //1.主动加载 4 Son son = new Son(); 5 6 //2.通过子类引用父类的静态变量,会让父类加载 7 System.out.println(Son.a); 8 9 //3.Class.forName()方法让子类加载 10 Class c = Class.forName("TestMyself.Son"); 11 12 //4.定义数组,类不会被加载 13 Son[] sons=new Son[3]; 14 15 //5.调用静态常量类也不会被加载 16 System.out.println(Son.c); 17 } 18 } 19 class Father{ 20 static int a=100; 21 static{ 22 System.out.println("Father 静态代码块"); 23 } 24 } 25 26 class Son extends Father{ 27 static int b=200; 28 static final int c=300; 29 static{ 30 System.out.println("Son 静态代码块"); 31 } 32 }
3.获得类加载器:
主要方法:
classLaoder.getSystemClassLoader():获得系统类加载器;
getParent():获得父类加载器;
1 //获得类加载器--->Class.getClassLoader():Class对象获得类加载器 2 public class Test4 { 3 public static void main(String[] args) throws ClassNotFoundException { 4 //系统类加载器:-->加载用户定义的类 5 ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader(); 6 System.out.println(systemClassLoader); 7 8 //扩展类加载器:-->加载扩展类 9 ClassLoader parent = systemClassLoader.getParent(); 10 System.out.println(parent); 11 12 //根加载器:--->加载核心类(用c/c++编写): 13 ClassLoader parent1 = parent.getParent(); 14 System.out.println(parent1); 15 16 ClassLoader classLoader = Class.forName("java.lang.String").getClassLoader(); 17 } 18 }