我目前正在为AP CS A考试学习一本书,尤其是Barron的考试准备书。

本书的一节涉及两个类,StudentGradStudent,其中GradStudent extends Student
GradStudent具有方法getId(),而Student不具有。

如果我要运行以下代码:

Student s = new GradStudent()
s.getId()

这本书告诉我,我会得到一个错误。为什么是这样?由于我将其初始化为GradStudent,因此s不能访问getId()方法吗?

本质上,如果我将变量声明为超类,并将其初始化为子类,会发生什么?

换句话说,以下示例中的sg有何不同:
Student s = new GradStudent()
GradStudent g = new GradStudent()

编辑:

我现在知道s仅可以访问Student类中的方法。
那么,如果我执行以下操作会发生什么:
Student s = (new GradStudent().setId(1) )
id字段会怎样? (假设它仅存在于GradStudent类中)如果我再次将s转换为GradStudent,它是否能够访问相同的id

最佳答案

因为s被声明为Student类型,您会收到一个错误。实例化为new GradStudent()无关紧要,编译器仅知道s声明为哪种类型。因此,基本上,您只能像使用s一样使用Student(只能使用Student类定义的方法)。

如果确实需要使用.getId(),则有两个选择。您可以将s声明为GradStudent:

GradStudent s = new GradStudent();
System.out.println(s.getId());

或者,您可以将s转换为GradStudent:
Student s = new GradStudent();
System.out.println(((GradStudent) s).getId());

07-24 13:44