这段代码的最后两行说明了问题:当我使用对对象的引用时,编译器可以工作,但是当我将引用分配给数组元素时,编译器就不能工作。其余代码位于同一程序包中的单独文件中。 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
}
}
最佳答案
有很多丢失的信息,例如s0是什么,或者如果BioStudent和ChemStudent扩展了Student,但是我仅假设所有这些都是正确的,并且s0是BioStudent或ChemStudent。
如果是这样,我不完全确定正确的术语,但是当您使用父类型的引用变量并将其指向Child对象时,只有在这些方法覆盖父方法的情况下,您才可以访问子方法。
换句话说,您需要在父类Student中定义getMajor()方法,然后在子类BioStudent和/或ChemStudent中进行覆盖。