1. Java之类的加载过程
1.1 Java内存分析
1.2 类的加载过程
示例:
package annoAndRe.reflection;
public class Test04 {
public static void main(String[] args) {
A a = new A();
System.out.println(A.m);
/*
1.加载到内存,会产生一个类对应的class对象
2.链接,链接结束后 m =0
3.初始化
<clinit>(){
System.out.println("A类静态代码块初始化");
m = 300;
m = 100;
}
*/
}
}
class A {
static {
System.out.println("A类静态代码块初始化");
m = 300;
}
static int m = 100;
public A() {
System.out.println("A类的无参构造初始化.");
}
}
运行结果:
1.3 什么时候会发生类的初始化
构造方法本质上也是静态方法。
示例:
package annoAndRe.reflection;
public class Test05 {
static {
System.out.println("Main类被加载");
}
public static void main(String[] args) throws ClassNotFoundException {
//1.主动引用
Son son = new Son();
}
}
class Father {
static int b = 2;
static {
System.out.println("父类被加载了");
}
}
class Son extends Father {
static {
System.out.println("子类被加载了");
}
static int m = 100;
static final int M = 1;
}
运行结果:
package annoAndRe.reflection;
public class Test05 {
static {
System.out.println("Main类被加载");
}
public static void main(String[] args) throws ClassNotFoundException {
//2.反射也会产生主动引用
Class.forName("annoAndRe.reflection.Son");
}
}
class Father {
static int b = 2;
static {
System.out.println("父类被加载了");
}
}
class Son extends Father {
static {
System.out.println("子类被加载了");
}
static int m = 100;
static final int M = 1;
}
运行结果:
package annoAndRe.reflection;
public class Test05 {
static {
System.out.println("Main类被加载");
}
public static void main(String[] args) throws ClassNotFoundException {
new Son();
}
}
class Father {
static int b = 2;
static {
System.out.println("父类被加载了");
}
public Father() {
System.out.println("Father");
}
}
class Son extends Father {
static {
System.out.println("子类被加载了");
}
public Son() {
System.out.println("Son");
}
static int m = 100;
static final int M = 1;
}
运行结果:
1.4 类加载器