此代码的最后两行说明了问题:编译器在我使用对象的引用时工作,但在我将引用分配给数组元素时则不行。其余代码在单独的文件中位于同一个包中。 BioStudent和ChemStudent是单独的课程,也是学生。
package pkgPoly;
public class Poly {
public static void main(String[] arg) {
Student[] stud = new Student[3];
// create a biology student
BioStudent s1 = new BioStudent("Tom");
// create a chemistry student
ChemStudent s2 = new ChemStudent("Dick");
// fill the student body with studs
stud[0] = s1;
stud[1] = s2;
// compiler complains that it can't find symbol getMajor on next line
System.out.println("major: " + stud[0].getMajor() ); // doesn't compile;
System.out.println("major: " + s0.getMajor() ); // works: compiles and runs correctly
}
}
答案 0 :(得分:1)
有很多缺失的信息,例如什么是s0,或者BioStudent和ChemStudent是否延伸学生,但是我只是假设所有这一切都是正确的,s0是BioStudent或ChemStudent
如果是这样,我不完全确定正确的术语,但是当您使用父类型的引用变量并将其指向Child对象时,如果这些方法覆盖父方法,则只能访问子方法。
换句话说,您需要在父类Student中定义getMajor()方法,然后在您的子类BioStudent和/或ChemStudent中重写。
答案 1 :(得分:1)
stud是Student类的对象。
我假设很少 -
这就是stud [0] .getMajor()给你一个编译时错误的原因。
您必须将其类型转换为Student的子类。
System.out.println("major: " + ((BioStudent) stud[0]).getMajor() );
答案 2 :(得分:1)
根据给出的信息,我假设了几件事。
你得到的错误是因为学生班没有getMajor()
,但BioStudent和ChemStudent有这种方法。
您已创建学生数组。对于编译器stud[0]
是Student类,而不是BioStudent或ChemStudent。只有在运行时jre才会知道stud [0]有BioStudent而stud [1]有ChemStudent。这就是你得到编译错误的原因。
解决方案1:
将getMajor()
方法添加到Student类,另外2个类覆盖它。
OR
解决方案2:
Typecast将此添加到您的打印语句(BioStudent stud[0]).getMajor()
- 这明确表示这是BioStudent对象,编译器会知道BioStudent已getMajor()
。