当子类使用Object变量实例化时,无法从超类访问方法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了当子类使用Object变量实例化时,无法从超类访问方法相关的知识,希望对你有一定的参考价值。

我正在练习继承,并且在Bite扩展Gulp课程时有这些课程。

public class Gulp {
    public void method2() {
        System.out.println("Gulp 2");
        method3();
    }

    public void method3() {
        System.out.println("Gulp 3");
    }
}

public class Bite extends Gulp {
    public void method1() {
        System.out.println("Bite 1");
    }

    public void method3() {
        System.out.println("Bite 3");
    }
}

我试图通过创建Bite类的对象(使用三种不同类型的引用:Object,Bite和Gulp)来调用方法method2(),如下所示:

public class Main {
    public static void main(String[] args) {
        Object varObj = new Bite();
        Bite varBite = new Bite();
        Gulp varGulp = new Bite();

        if(varBite.getClass() == Bite.class) 
            System.out.println("Bite class");

        if(varObj.getClass() == Bite.class) 
            System.out.println("Also Bite class");

        varBite.method2();
        //prints what is expected

        varObj.method2();
        //throws compilation error -- cannot find method2()

        varGulp.method2();
        //prints what is expected
    }
}

当引用变量是Object的类型时,我收到错误。它说,虽然varObject.getClass()返回Bite.class,但它找不到符号。任何人都可以解释..

答案

如果您声明变量类型为Bite,编译器将不允许您调用特定于Object的方法。

您有两个选择:将对象声明为Bite,如varBite。或者将Object变量强制转换为Bite

((Bite)varObj).method2();

以上是关于当子类使用Object变量实例化时,无法从超类访问方法的主要内容,如果未能解决你的问题,请参考以下文章

当子类被实例化时,超类的私有成员是不是也被实例化? [复制]

无法从超类访问 Django 模型的子类

如何使子类只能从实例访问?

从超类对象初始化子类实例

Symfony2 从超类确定和访问子类

子类没有正确地从超类继承结构[重复]