我目前正在为AP CS A考试学习一本书,尤其是Barron的考试准备书。
本书的一节涉及两个类,Student
和GradStudent
,其中GradStudent
extends
Student
。GradStudent
具有方法getId()
,而Student
不具有。
如果我要运行以下代码:
Student s = new GradStudent()
s.getId()
这本书告诉我,我会得到一个错误。为什么是这样?由于我将其初始化为
GradStudent
,因此s
不能访问getId()
方法吗?本质上,如果我将变量声明为超类,并将其初始化为子类,会发生什么?
换句话说,以下示例中的
s
和g
有何不同: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());