java Class被加载的时机
来源:互联网 发布:nba数据统计20172018 编辑:程序博客网 时间:2024/05/18 03:30
简单概括:当主动使用此类时,就会被加载,分为以下6种情况:
1.创建类的实例
2.访问某个类或者接口的静态变量,或者对该静态变量赋值
3.调用类的静态方法
4.反射(Class.forName())
5.初始化类的子类
6.java虚拟机启动时的main方法所在类
下面用代码来举例:
首先要明白的是,类被加载判断:类中的静态代码块会执行。
实例一:
public class ClassLoaderTest { public static void main(String[] args){ //加了final后编译期确定,所以不会加载Target类 System.out.println(Target.x); }}class Target { public static final int x = 6 / 3 ; static { System.out.println("Target类被加载了"); }}// 结果 : 2
实例二:
public class ClassLoaderTest { public static void main(String[] args){ //会加载Target类 System.out.println(Target.x); }}class Target { public static int x = 6 / 3 ; static { System.out.println("Target类被加载了"); }}// 结果 : Target类被加载了 2
实例三:
public class ClassLoaderTest { public static void main(String[] args){ //都是使用父类的 ,不会加载子类Target类 System.out.println(Target.x); Target.p(); }}class Parent{ static int x = 0; static void p(){ }}class Target { static { System.out.println("Target类被加载了"); }}//结果 0
实例四:
public class ClassLoaderTest { public static void main(String[] args){ // 获得应用类加载器 ClassLoader appLoader = ClassLoaderTest.class.getClassLoader().getSystemClassLoader(); Class tClazz = appLoader.loadClass("Target");//这里不会导致Target类被加载,只是加载文件成二进制 System.out.println("loadClass"); tClazz.newInstance(); // 这里就会导致Target被加载 }}class Target { static { System.out.println("Target类被加载了"); }}// 结果 : loadClass Target类被加载了
最后来一个奇怪的实例
public class ClassLoaderTest { public static void main(String[] args){ Target.getInstance(); System.out.println(Target.a + ","+Target.b); }}class Target { private static final Target t = new Target(); static int a ; static int b = 0; private Target(){ a++; b++; } public static Target getInstance(){ return t ; }}//这里大家猜下结果会是神马?A 1,0B 0,1C 0,0D 1,1
很多人可能会猜到肯定是打印 1,1 啊 ,都不用想啊,实际并非如此!应该是1,0
分析: 首先编译期间,各静态变量都声明了,等号右边的这时都还不用管。然后加载Target类时 ,静态从上往下看,static final Target会导致构造执行,a和b 都加1 ,此时a和b都是1 ,然后 到b时,主动又赋值为0 ,所以b会从1变到0,而a不变。
如果将Target变成这样
class Target { static int a ; static int b = 0; private static final Target t = new Target(); private Target(){ a++; b++; } public static Target getInstance(){ return t ; }}// 结果 1 , 1
谢谢大家,完毕!来句闲话,深圳有爱好音乐的会打鼓的程序员可以一起交流加入我们乐队一起嗨。我的QQ:657455400
4 0
- java Class被加载的时机
- java Class 的加载时机
- Java类加载的时机
- Java类加载的时机
- Java 类的加载时机
- java中JVM加载类的时机
- JVM中java类的加载时机
- Java中类加载的时机
- JVM中java类的加载时机
- java类加载时机
- Java 程序加载加载--------类的初始化时机
- java中类的加载和加载时机
- Java的Class类及static块的执行时机
- 类加载的时机
- 类加载的时机
- 类加载的时机
- JVM:class加载时机及两种显示加载的区别
- java类的加载 初始化时机,已经静态代码块的执行时机
- jemeter 创建请求-解决json乱码问题
- JavaEE复习笔记(3)——Servlet相关技术
- PHP传给前端的值有大量html代码
- -Dmaven.multiModuleProjectDirectory system property is not set. Check $M2_HOME environment variable
- 【多视图几何】对极几何与基本矩阵
- java Class被加载的时机
- xcode真机调试10.2系统
- tomcat中class和jar的加载顺序
- JEDI Visual Component Library
- ThreadPoolExecutor机制
- 33. Spring Boot 监控和管理生产环境【从零开始学Spring Boot】
- Java提高篇——对象克隆(复制)
- Css总结
- 三维激光测距之三角法测距