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 }