抽象类不能直接实例化,但可通过子类继承后实例化、匿名内部类临时实现、反射创建子类实例或在抽象方法中用this.getclass()识别具体实现类。

抽象类本身不能直接 new 出对象,但“获取对象”这个需求在实际开发中很常见——关键不是绕过规则,而是用符合面向对象设计的方式拿到可用的实例。
通过子类继承后实例化
这是最标准、最推荐的做法。抽象类定义共性,具体行为由子类实现,对象自然也来自子类。
- 定义抽象类(如
Animal),含抽象方法(如makeSound())和普通字段 - 编写具体子类(如
Dog、Cat),重写所有抽象方法 - 直接
new Dog()或new Cat(),得到的是Animal类型的引用,但指向具体子类对象
使用匿名内部类临时实现
适合测试、回调或逻辑简单且只用一次的场景,无需单独定义子类文件。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 语法:
new 抽象类名() { /* 实现抽象方法 */ }; - 例如:
Animal a = new Animal() { public void makeSound() { System.out.println("Unknown sound"); } }; - 本质仍是创建了一个隐式子类的实例,JVM 自动生成类名(如
Animal$1.class)
借助反射间接操作子类
适用于框架层或需要动态加载实现类的场景(如插件系统、配置驱动的策略选择)。
- 先确保有已知的具体子类(如
Circle继承自Shape) - 用
Class.forName("Circle")获取其 Class 对象 - 调用
getDeclaredConstructor().newInstance()创建实例,再向上转型为抽象类类型 - 注意:需处理
ClassNotFoundException、InstantiationException等异常,且构造器必须可访问
在抽象类内部获取当前实现类信息
有时不需要外部创建对象,而是想在抽象方法里知道“谁在调用我”。这时可通过 this.getClass() 动态识别。
-
this在运行时总是指向具体子类实例,所以this.getClass()返回的是子类的Class对象 - 可用于日志记录、泛型类型推断(配合
ResolvableType)、或根据实现类做差异化处理 - 例如:
System.out.println("当前实现类:" + this.getClass().getSimpleName());
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










