1;类加载
在java代码中,类型的加载,链接与初始化过程都是在程序运行奇迹完成的
2;jvm与程序的生命周期
执行 system.exit() ,正常结束,遇到异常,系统出现错误导致进行终止
3;类的加载,链接与初始化
加载:查找并加载类的二进制数据
连接: 验证:确保被加载的类的争取性
准备:为类的静态变量分配内存,并将其初始化为默认值
解析:把类中的符号引用转换为直接引用
初始化:为类的静态变量赋予争取的初始化值
4;Java程序对类的使用方式可分为两种
主动使用
被动使用
5;类的加载:
类的加载指的是将累的.class文件中的二进制数据读入到内存中,将其放在运行时数据去的方法去内,然后在内存中创建一个java.lang.Class对象用来封装类在方法去内的数据结构
对静态字段来说,只有直接定义了该字段的类才会被初始化
当一个类在初始化时,要求其父类全部都已经初始化完毕了,
-XX:+TraceClassLoading,用于追踪类的加载信息并打印出来
-XX:+<option> 表示开始option选项
-XX:-<option> 表示关闭option选项
-XX:<option>=<value> 表示将option选项的值设置为value
常量在编译阶段会存入到调用到这个常量的方法所在的类的常量池中,本质上调用类并没有直接引用到定义常量的类,因此并不会触发
当一个常量的值并非编译期间可以确定的,那么其值就不会被放到调用类的常量池中,这时在程序运行时,会导致主动使用这个常量所在的类,显然会导致这个类被初始化
当一个接口在初始化时,并不要求其父接口都完成初始化,只有在真正使用到父接口的接口,才会初始化
public class classloader {
public static void main(String[] args) {
Singleton e = Singleton.getSingleton();
System.out.println(e.a);
System.out.println(e.b);
}
}
class Singleton{
public static int a;
// public static int b=1;
private static Singleton singleton= new Singleton();
private Singleton(){
a++;
b++;
System.out.println(a);
System.out.println(b);
}
public static int b=1;
public static Singleton getSingleton(){
return singleton;
}
}