超类Arraylist Java中的子类

问题描述

我有一个超类Student和两个子类RStudentCStudent,它们继承自Student。我希望能够同时拥有ArrayListRStudent中的一个CStudent。我尝试仅使用ArrayList<Student> students = new Arraylist<>();,但是无法访问特定于子类的任何变量,例如,如果我使用students.add(newCStudent),则当我尝试使用students.get(0).mark(这是一个变量)时,仅在CStudent中无效)。我该怎么办?

解决方法

您不能同时使用两种方式-如果您拥有List<Student>来同时持有两种类型的Student,则无法访问RStudent或{{1 }},而无需明确地向下转换。例如

CStudent
,
  1. 我建议您声明通用类型List的引用,而不要声明ArrayList本身,例如List<Student>
  2. 超类Student不应了解有关其子类的任何信息,即,为了使用子类的引用来访问子类的元素,您需要告诉编译器您要访问该元素通过使用超类的引用来定义子类,您可以通过向下转换来实现,即将超类的引用转换为子类的类型。
  3. 知道您可以使用运算符instanceof检查对象的类型也可能对您有所帮助。

例如

List<Student> students = new ArrayList<>();

CStudent s1 = new CStudent();
s1.setMark(90);
students.add(s1);

RStudent s2 = new RStudent();
students.add(s2);

//...and so on

for (Student student : students) {
    if (student instanceof CStudent) {// Checking if the instance is of type,CStudent
        CStudent s = (CStudent) student; // downcasting
        System.out.println(s.getMark());// Assuming `CStudent` has `public` getter for mark
    }
}