Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 当使用对象变量实例化子类时,无法从超类访问方法_Java_Inheritance - Fatal编程技术网

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

Java 当使用对象变量实例化子类时,无法从超类访问方法,java,inheritance,Java,Inheritance,我在练习继承,在这些课程中,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 {

我在练习继承,在这些课程中,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
的方法

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

((Bite)varObj).method2();

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

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

((Bite)varObj).method2();

您缺少一些面向对象的原则。必须区分对象的引用类型和实际类型。您只能调用引用类型(Object、Gulp或Bite)中定义的方法,但实际调用的方法是由实际类型定义的,在所有情况下都是Bite(buzzword多态性)。重要的是引用类型,而不是对象类型
varObj
是一个
对象
参考,而
对象
没有
方法2
您缺少一些面向对象的原则。必须区分对象的引用类型和实际类型。您只能调用引用类型(Object、Gulp或Bite)中定义的方法,但实际调用的方法是由实际类型定义的,在所有情况下都是Bite(buzzword多态性)。重要的是引用类型,而不是对象类型
varObj
是一个
对象
引用,
对象
没有
method2