通过类加载和初始化的一些题目理解Java类加载过程
通过题目重点理解:Class加载流程和运行时区域
目录
- 子类和父类static变量
- 父子类加载顺序2
- class.forName初始化
子类和父类static变量
class Parent {static int a = 1;static int b = 2;static int c;static {c = 3;System.out.println("parent static block");}public String name;{name = "parentName";System.out.println("parent nonStatic code");}public Parent() {System.out.println("Parent()");}public Parent(String name) {this.name = name;System.out.println("Parent(String)");}
}class Son extends Parent {static int a;static int b = 3;public String name;static {System.out.println("son static block");}{System.out.println("son nonStatic code");}public Son() {System.out.println("Son()");}public Son(String name) {super(name);this.name = name;System.out.println("Son(String)");}public String getName() {return name;}public void setName(String name) {this.name = name;}
}public class Main {public static void main(String[] args) {Son son = new Son();System.out.println(son.getName());}}
/*
parent static block
son static block
parent nonStatic code
Parent()
son nonStatic code
Son()
null*/
不用可以被,理解class加载流程即可:https://blog.csdn.net/qq_26437925/article/details/145503360
- 实例化会触发类
初始化
,子类初始化必须先初始化父类;类初始化只会执行一次
所以
parent static block
son static block
- 子类实例化,默认调用父类的
无参构造函数
;非静态代码块,构造函数都是实例化
的事情;非静态代码块在构造函数前初始化类实例信息用的;
所以
parent nonStatic code
Parent()
son nonStatic code
Son(String)
- 最后输出数据是null
父子类加载顺序2
上面例子使用不同构造函数
class Parent {static int a = 1;static int b = 2;static int c;static {c = 3;System.out.println("parent static block");}public String name;{name = "parentName";System.out.println("parent nonStatic code");}public Parent() {System.out.println("Parent()");}public Parent(String name) {this.name = name;System.out.println("Parent(String)");}
}class Son extends Parent {static int a;static int b = 3;public String name;static {System.out.println("son static block");}{System.out.println("son nonStatic code");}public Son() {System.out.println("Son()");}public Son(String name) {super(name);this.name = name;System.out.println("Son(String)");}public String getName() {return name;}public void setName(String name) {this.name = name;}
}public class Main {public static void main(String[] args) {Son son = new Son();System.out.println(son.getName());System.out.println("-----");Son son1 = new Son("son1");System.out.println(son1.getName());}}
/*
parent static block
son static block
parent nonStatic code
Parent()
son nonStatic code
Son()
null
-----
parent nonStatic code
Parent(String)
son nonStatic code
Son(String)
son1*/
class.forName初始化
class Parent {static int a = 1;static int b = 2;static int c;static {c = 3;System.out.println("parent static block");}public String name;{name = "parentName";System.out.println("parent nonStatic code");}public Parent() {System.out.println("Parent()");}public Parent(String name) {this.name = name;System.out.println("Parent(String)");}
}class Son extends Parent {static int a;static int b = 3;public String name;static {System.out.println("son static block");}{System.out.println("son nonStatic code");}public Son() {System.out.println("Son()");}public Son(String name) {super(name);this.name = name;System.out.println("Son(String)");}public String getName() {return name;}public void setName(String name) {this.name = name;}
}public class Main {public static void main(String[] args) throws Exception{Main main = new Main();Class clazzSon = Class.forName("Son", false, main.getClass().getClassLoader());System.out.println("-----");Class clazzSon2 = Class.forName("Son", true, main.getClass().getClassLoader());}}
/*
-----
parent static block
son static block*/
- class.forName会初始化,是否静态初始化可以传递参数设置