类的初始化过程
类的初始化过程
类的加载步骤
package com.han.reflection;
/*
* 执行结果如下:
* A类静态代码块初始化!
* A类的无参构造器执行了!
* 20
*/
public class Test04 {
public static void main(String[] args) {
A a = new A();
System.out.println(A.m);
}
/*
* 类的加载过程
* 1.加载到内存,会产生一个Class对象
* 2.链接结束后,m = 20
* 3.初始化
* <clinit>(){
* System.out.println("A类静态代码块初始化!");
* m = 10;
* m = 20;
* }
*/
}
class A{
static {
System.out.println("A类静态代码块初始化!");
m = 10;
}
static int m = 20;
public A(){
System.out.println("A类的无参构造器执行了!");
}
}
下面再举个例子看下类的加载过程
package com.han.reflection;
public class Test05 {
static {
System.out.println("Main类被加载");
}
public static void main(String[] args) throws ClassNotFoundException {
/* 1.主动new对象
* 运行结果如下:
*
* Main类被加载
* 父类被加载
* 子类被加载
*/
//Son son = new Son();
/* 2.通过反射创建对象
* 运行结果如下:
*
* Main类被加载
* 父类被加载
* 子类被加载
*/
//Class.forName("com.han.reflection.Son");
/** 3.通过子类调用父类的变量,会发现子类没有被加载
* 运行结果如下:
*
* Main类被加载
* 父类被加载
* 1
*/
//System.out.println(Son.b);
/* 4.创建数组,会发现自会加载Main类
* 运行结果如下:
*
* Main类被加载
*/
//Son [] array = new Son[5];
/* 5.调用子类对的常量
* Main类被加载
* 10
*/
System.out.println(Son.M);
}
}
/*
父类
*/
class Father{
static int b = 1;
static {
System.out.println("父类被加载");
}
}
/*
子类
*/
class Son extends Father{
static {
System.out.println("子类被加载");
}
static int a = 2;
static final int M = 10;
}