0

这段代码的最后两行说明了这个问题:当我使用对对象的引用时编译器工作,但当我将引用分配给数组元素时编译器工作。其余代码位于不同文件的同一包中。BioStudent 和 ChemStudent 和 Student 是不同的类。

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
     }
}
4

3 回答 3

1

有很多缺失的信息,例如 s0 是​​什么,或者 BioStudent 和 ChemStudent 是否扩展了 Student,但是我假设所有这些都是正确的,并且 s0 是​​ BioStudent 或 ChemStudent。

如果是这样,我不完全确定正确的术语,但是当您使用父类型的引用变量并将其指向子对象时,如果这些子方法覆盖父方法,您只能访问子方法。

换句话说,您需要在父类 Student 中定义 getMajor() 方法,然后在子类 BioStudent 和/或 ChemStudent 中覆盖该方法。

于 2013-10-28T21:51:24.647 回答
1

stud 是 Student 类的对象。

我假设几件事 -

  • BioStudent 和 ChemStudent 扩展了学生类。
  • BioStudent 有一个方法 getMajor()
  • 学生班没有!

这就是 stud[0].getMajor() 给你一个编译时错误的原因。

您必须将其类型转换为 Student 的子类。

System.out.println("major: " + ((BioStudent) stud[0]).getMajor() ); 
于 2013-10-28T21:56:32.673 回答
1

根据给出的信息,我假设了几件事。

  • 学生是超级班
  • BioStudent 和 ChemStudent 扩展了学生
  • 螺柱 [0] = s1
  • 螺柱 [1] = s2

您得到的错误是因为 Student 类没有,getMajor()但 BioStudent 和 ChemStudent 有该方法。

您已经创建了一个学生数组。因为编译器stud[0]是 Student 类,而不是 BioStudent 或 ChemStudent。只有在运行时 jre 才会知道 stud[0] 有 BioStudent 并且 stud[1] 有 ChemStudent。这就是您收到编译错误的原因。

  • 解决方案1:

    getMajor()方法添加到 Student 类,其他 2 个类覆盖它。

或者

  • 解决方案2:

    通过将其添加到您的打印语句进行(BioStudent stud[0]).getMajor()类型转换 - 这明确意味着这是 BioStudent 对象,编译器会知道 BioStudent 有getMajor().

于 2013-10-28T22:19:54.573 回答