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