发布于2026-07-04 阅读(0)
扫一扫,手机访问
不能直接判断对象是否属于抽象类,因抽象类不可实例化;实际应判断其运行时类型是否为该抽象类或其非抽象子类,用 instanceof 或 isAssignableFrom 实现。

先澄清一个常见的认知偏差:抽象类不能实例化,所以你没法拿一个“new 抽象类()”出来的对象去问它是不是属于这个类。但实际开发中,我们经常需要判断某个对象的运行时类型是否“可视为”某个抽象类——说白了,就是看这个对象是不是该抽象类的子类实例。判断方式其实就两种主流手段:instanceof 和反射的 isAssignableFrom。
instanceof 判断对象是否为某抽象类的实例这是最直观的写法,没有之一。只要对象的实际类型是目标抽象类或其任意非抽象子类,instanceof 就返回 true。它检查的是运行时类型可否赋值给目标类型,跟目标是不是抽象类完全没关系。
Shape(抽象类),对象是 new Circle()(子类实例),结果依然是 true。abstract class Shape { abstract double area(); }
class Circle extends Shape { ... }
Shape s = new Circle();
System.out.println(s instanceof Shape); // true
System.out.println(new Circle() instanceof Shape); // true
System.out.println("hello" instanceof Shape); // 编译错误(String 不是 Shape 的子类)
如果手里拿的是 Class 对象(比如从配置、泛型、类加载器获取的),想确认这个类是否继承自某个抽象类(或自身就是那个抽象类),那就用 isAssignableFrom。
AbstractClass.class.isAssignableFrom(clazz) 检查 clazz 是否为 AbstractClass 的子类(含自身)。Class> c = Circle.class;
boolean isSubtypeOfShape = Shape.class.isAssignableFrom(c); // true
boolean isShapeItself = Shape.class.isAssignableFrom(Shape.class); // true(自身也算)
这两个概念经常被混在一起,但本质完全不同:
Modifier.isAbstract(clazz.getModifiers())。instanceof 或 isAssignableFrom。Circle.class 不是抽象类(Modifier.isAbstract → false),但 new Circle() 属于 Shape 抽象类(instanceof Shape → true)。getClass() == AbstractClass.class?这个简单:抽象类不能实例化,所以 new AbstractClass() 编译都过不去。运行时根本不存在一个运行时类型就是抽象类自身的对象(除非是 null,但 null instanceof X 永远 false)。用 == 比较既无意义,也不符合面向对象的多态设计初衷——我们要的是“是否可视为该类型”,而不是“是不是该类型本身”。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8