多态行为未实施

时间:2013-10-28 21:43:43

标签: java

此代码的最后两行说明了问题:编译器在我使用对象的引用时工作,但在我将引用分配给数组元素时则不行。其余代码在单独的文件中位于同一个包中。 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
     }
}

3 个答案:

答案 0 :(得分:1)

有很多缺失的信息,例如什么是s0,或者BioStudent和ChemStudent是否延伸学生,但是我只是假设所有这一切都是正确的,s0是BioStudent或ChemStudent

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

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

答案 1 :(得分:1)

stud是Student类的对象。

我假设很少 -

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

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

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

System.out.println("major: " + ((BioStudent) stud[0]).getMajor() ); 

答案 2 :(得分:1)

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

  • 学生是超级
  • BioStudent和ChemStudent扩展学生
  • stud [0] = s1
  • stud [1] = s2

你得到的错误是因为学生班没有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()