类的加载过程(类的初始化)
类的加载过程(类的初始化)
1.加载父类的静态变量
2.加载父类的静态代码快
3.加载子类的静态变量
4.加载子类的静态代码快
(其实,静态变量和静态代码块肯定是按照顺序初始化的,反正java语法不支持提前引用)
类的实例化,相当于JVM对字节码文件信息的一次扫描,并且把扫描结果分类存放到方法区中。
而方法区里存放什么呢,其实我一直对这块比较模糊,之前只知道方法区中,有常量池、有存放静态变量的静态区,在学习了反射,发现方法区中有Field区、Method区,还存放着类的继承、接口等信息。
实例:
package com.xm.load;
public class Animal {
static String str = "I`m a animal!";
static {
System.out.println(str);
System.out.println("加载父类静态代码块");
}
}
class Dog extends Animal{
static String str = "I`m a dog!";
static {
System.out.println(str);
System.out.println("加载子类静态代码块");
}
public static void main(String[] args) {
new Dog();
}
}
结果:
I`m a animal!
加载父类静态代码块
I`m a dog!
加载子类静态代码块
要知道,类的加载和对象的实例化是不一样的。
类的加载只会发生一次,而对象的实例化却是和new的次数相关的。
而类的加载一定会发生在对象的初始化之前。
实例:
package com.xm.load;
public class Animal {
static String str = "I`m a animal!";
static {
System.out.println(str);
System.out.println("加载父类静态代码块");
}
static void doing() {
System.out.println("This ia a Animal!");
}
public Animal() {
doing();
System.out.println("Animal 对象实例化");
}
}
class Dog extends Animal{
static String str = "I`m a dog!";
static {
System.out.println(str);
System.out.println("加载子类静态代码块");
}
static void doing() {
System.out.println("This ia a dog!");
}
public Dog() {
doing();
System.out.println("Dog 对象实例化");
}
public static void main(String[] args) {
new Dog();
}
}
结果:
I`m a animal!
加载父类静态代码块
I`m a dog!
加载子类静态代码块
This ia a Animal!
Animal 对象实例化
This ia a dog!
Dog 对象实例化
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步