这段代码的最后两行说明了问题:当我使用对对象的引用时,编译器可以工作,但是当我将引用分配给数组元素时,编译器就不能工作。其余代码位于同一程序包中的单独文件中。 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中进行覆盖。

07-24 20:23