每个 类(.java文件) 都有自己唯一一份 .class 文件,封装到对应的Class对象中。java程序中类被用到,就会被类加载器 加载到JVM中,进行初始化操作。如果类加载器找不到对应类的.class文件,就会报ClassNotFoundException异常。
类加载时机 : static 成员被调用(构造函数实际上也是static《java编程思想4.0》7.9 有相关介绍) ,或者对象被创建。
类初始化 :主要是分配数据存储空间和成员变量赋值(基本变量赋值0(假设一个int),引用变量赋值null , static内容执行)。
拓展认识:
- 有继承时的初始化 : 最底层基类先初始化 ,然后逐级往上初始化。最外层能否被正确初始化,取决于其基类能否被初始化。
- 我们知道所有类的最上层基类都是Object ,如果是显示指明调用构造函数,则只按顺序执行被调用的构造,如果一个构造函数中,同时使用super构造和this构造,这样人为干预顺序是不行的,实际上要让Object最先初始化,这就可以解释为什么 在一个构造函数中,this 构造和 super 构造不能同时存在。
简单示例 :
public class Shape{
public Shape(){
System.out.println("默认优先调用基类构造");
}
}
class Circle extends Shape{
public Circle(){
this("当前类其他构造");
System.out.println("当前类构造");
}
public Circle(String s){
System.out.println(s);
}
public static void main(String[] args) {
Circle dir = new Circle();
}
}
输出: