类加载的初始化和不初始化
初始化
1.遇到new,getstatic,putstatic或invokestatic这四条字节码指令时,如果类没有进行初始化,则先要触发其初始化。生成这四条指令的常见Java代码场景是:使用new关键字实例化对象的时候,读取或设置一个类静态字段(被final修饰,已在编译器把结果放入常量池的静态字段除外)的时候,以及调用一个类的静态方法的时候。
2.使用Java.lang.reflect包的方法对类进行反射调用的时候,如果类没有进行过初始化,则需要先触发其初始化。
3.当初始化一个类的时候,如果发现其父类还没有进行初始化,则需要先触发其父类的初始化。
4.当虚拟机启动的时候,用户需要指定一个需要执行的主类(包括main()方法的那个类),虚拟机会先初始化这个类。
不会初始化
父类
package com.zou.test9e;
public class F {
static {
System.out.println("加载父类");
}
public static int num =10;
}
子类
package com.zou.test9e;
public class Child extends F{
static {
System.out.println("加载子类");
}
public static final int a=20;
}
1. ----------通过子类引用父类的静态字段,子类不会被初始化
package com.zou.test9e;
public class Main {
public static void main(String[] args) {
// TODO 自动生成的方法存根
System.out.println(Child.num);
}
}
2. -----------通过数组定义来引用类
package com.zou.test9e;
public class Main {
public static void main(String[] args) {
// TODO 自动生成的方法存根
Child[] c=new Child[10];
}
}
3.------------调用类的常量
package com.zou.test9e;
public class Main {
public static void main(String[] args) {
// TODO 自动生成的方法存根
System.out.println(Child.a);
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报