类加载:
在java代码中,类型(class/interface/enum)的加载,连接和初始化都是在程序运行期间完成的,提供了很大的灵活性
··
类加载器:
java虚拟机结束生命周期的几种情况:
1:程序正常结束
2:调用system.exit退出
3:出现异常未捕获而导致的异常退出
4:操作系统异常导致的程序结束
类加载:
加载:查找并加载类的二进制文件到内存
连接:
验证:二进制文件是否符合规范
准备:将类的静态成员变量分配内存,并赋予默认值
class Test{
public static int a =1; //连接准备阶段,给a分配内存,并赋予默认值0,此时并不是1
}
解析:将类中的符号引用转化为直接引用。(不是很理解,大概的意思应该是 比如 类使用了其他类里面的方法,换成了指针,直接指向,方便进行查找)
初始化阶段:将静态变量赋予初始值,将a赋予初始值1
使用
卸载
······
类的连接与初始化
1:java程序对类的使用方式可以分为2种
主动使用
被动使用
2:所有的java虚拟机实现必须在每个类或接口被java程序“首次主动使用”时才初始化他们
主动使用:(7种)
1:创建类的实例 new obj
2:访问某个类或接口的静态变量,或者对该静态变量赋值
3:调用类的静态方法
4:反射(class.forName("com.test.Test"))
5:初始化一个类的子类 new child
6:java虚拟机启动时被标注为启动类的 (包含main方法的)
7:jdk1.7提供的动态语言支持,(这个我也不是很清楚)
除了以上7种,其他使用java类的方式都被看作是对类的被动使用,都不会导致类的初始化,(就是类进行了加载和连接,但是没有初始化)
示例:
public class Test{
syso(child.str);// 不会初始化child,此处是对parent的初始化,主动使用parent,
syso(chile.str20);//会先初始化parent,然后初始化child,主动使用parent类的子类。
}
class parent{
public static string str = "hello word";
static{
systom.out.print("parent block");
}
}
class child extends parent{
public static string str2="WELCOME";
static{
systom.out.print("child block");
}
}
`
·