在 Java 中,“抽象类的加载机制”本质上和普通类的加载机制是一样的,因为抽象类(abstract class)在 JVM 层面并不是一个特殊的类类型,它只是语法层面的限制(不能实例化)。下面从 类加载过程、抽象类的特殊性、使用示例 几个方面说明。
Java 类从磁盘到内存,一般经历以下阶段(由 类加载器 ClassLoader 完成):
加载(Loading)
.class 文件Class 对象链接(Linking)
初始化(Initialization)
<clinit>() 方法✅ 抽象类也会完整经历以上过程
会。
只要满足以下任一条件,抽象类就会被加载和初始化:
Class.forName())AbstractClass.x; // 触发抽象类加载
虽然不能 new:
AbstractClass a = new AbstractClass(); // ❌ 编译错误
但可以:
super()abstract class Animal {
static {
System.out.println("Animal loaded");
}
Animal() {
System.out.println("Animal constructor");
}
}
class Dog extends Animal {}
当 new Dog() 时:
DogAnimal 加载Animal 静态代码块Animal 构造方法abstract class Parent {
static int x = 10;
static {
System.out.println("Parent static block");
}
Parent() {
System.out.println("Parent constructor");
}
}
class Child extends Parent {
Child() {
System.out.println("Child constructor");
}
}
public class Test {
public static void main(String[] args) {
new Child();
}
}
Parent static block
Parent constructor
Child constructor
| 对比项 | 抽象类 | 接口 |
|---|---|---|
| 是否加载 | ✅ 是 | ✅ 是 |
| 构造方法 | ✅ 有 | ❌ 无 |
| 静态代码块 | ✅ 有 | ❌(Java 8+ 有静态方法) |
| 初始化触发 | 子类或静态访问 | 子接口或静态访问 |
❌ 抽象类不会被加载
✅ 只要被使用,就会加载
❌ 抽象类不能执行代码
✅ 可以执行静态代码、构造逻辑
❌ 抽象类加载更“特殊”
✅ JVM 对它一视同仁
Java 抽象类的加载机制与普通类完全一致,区别仅在于语法层面不能实例化;只要被引用或被子类继承,就会被 JVM 正常加载、链接和初始化。
如果你愿意,我也可以讲:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。