Java和对象类型中的继承

pop*_*ero 5 java polymorphism inheritance

我正在学习一本AP CS A考试的书,特别是Barron的考试准备书.

这本书中有一节是指两个班,StudentGradStudent其中GradStudent extends Student.

GradStudent有方法getId()Student不是.

如果我要运行以下代码:

Student s = new GradStudent()
s.getId()
Run Code Online (Sandbox Code Playgroud)

这本书告诉我,我会收到一个错误.为什么是这样?由于我将其初始化为a GradStudent,无法s访问该方法getId()

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

换句话说,如何做到sg下面的示例有所不同:

Student s = new GradStudent()
GradStudent g = new GradStudent()
Run Code Online (Sandbox Code Playgroud)

编辑:

我现在明白s只能访问Student类中的方法.那么如果我执行以下操作会发生什么:

Student s = (new GradStudent().setId(1) )
Run Code Online (Sandbox Code Playgroud)

这个id领域会发生什么?(假设它只是存在于GradStudent类)如果我铸造sGradStudent再次,会是能够访问相同的id

pkp*_*pnd 10

因为你得到一个错误s声明为类型Student.没关系,这是实例化new GradStudent(),编译器只知道什么类型的s声明为.所以基本上你只能使用sStudent(因为它只能使用Student类定义的方法).

如果您真的需要使用.getId(),您有两种选择.您可以声明sGradStudent:

GradStudent s = new GradStudent();
System.out.println(s.getId());
Run Code Online (Sandbox Code Playgroud)

或者,您可以投射sGradStudent:

Student s = new GradStudent();
System.out.println(((GradStudent) s).getId());
Run Code Online (Sandbox Code Playgroud)