ArrayList能否存放父类的子类对象?如何判断其中对象的子类类型?
关于ArrayList存放子类对象及类型判断的问题
1. ArrayList能否存放子类B、C的对象?
完全可以。这是Java多态特性的体现——子类B、C本质上是父类A的实例,所以声明为ArrayList<A>的集合,完全可以存放B、C的对象。
2. 遍历ArrayList时判断对象类型的方法
有两种常用方式:
方式一:使用instanceof关键字
instanceof可以判断对象是否是某个类(或其子类)的实例,适合区分父类和子类的类型。示例代码:
// 定义类结构 class A {} class B extends A {} class C extends A {} public class Test { public static void main(String[] args) { ArrayList<A> list = new ArrayList<>(); list.add(new A()); list.add(new B()); list.add(new C()); for (A obj : list) { if (obj instanceof B) { System.out.println("当前对象是B类实例"); } else if (obj instanceof C) { System.out.println("当前对象是C类实例"); } else if (obj instanceof A) { System.out.println("当前对象是A类实例"); } } } }
方式二:使用getClass()方法
getClass()返回对象的实际运行时类,它会严格匹配类型(不会包含子类),适合需要精确判断对象所属类的场景。示例代码:
for (A obj : list) { if (obj.getClass() == B.class) { System.out.println("当前对象是B类实例"); } else if (obj.getClass() == C.class) { System.out.println("当前对象是C类实例"); } else if (obj.getClass() == A.class) { System.out.println("当前对象是A类实例"); } }
注意:如果有多层继承(比如B还有子类D),instanceof B会同时匹配B和D的实例,而getClass() == B.class只会匹配B的实例,可根据需求选择。
内容的提问来源于stack exchange,提问作者Tran Dai Duong FX17629
相关产品推荐
相关产品推荐

