我正在尝试了解继承,我遇到了这个问题。
以下是代码:
import java.util.*;
class Parent
{
void show()
{
System.out.println("show from parent");
}
}
class Child extends Parent
{
public static void main(String s[])
{
Parent p=new Child();
p.show();
p.display();
}
void show()
{
System.out.println("show from child");
}
void display()
{
System.out.println("display from child");
}
}
错误是:
G:\javap>javac Child.java
Child.java:15: error: cannot find symbol
p.display();
^
symbol: method display()
location: variable p of type Parent
1 error
如果我能够访问show()
那么为什么我无法访问display()
知道display()
是继承的,并且也存在于{{1}的类定义中}
答案 0 :(得分:7)
您必须了解运行时类型与编译时类型之间的区别。
在运行时,变量p
包含对Child
实例的引用。因此调用show
方法将运行Child#show
中的代码,因为这会覆盖方法Parent#show
。
在编译时,编译器只能知道变量的声明的类型。这是Parent
。因此,编译器只能允许访问Parent
类型的字段和方法,但不能访问Child
类型的字段和方法。
display
方法根本没有在Parent
中声明,因此错误。
答案 1 :(得分:1)
如果你想调用客户端的显示方法,那么你必须创建子类的对象。 例如。 儿童=新儿童();
否则你需要在父类中编写显示方法。
规则是孩子的父类无法召唤成员的参考。
答案 2 :(得分:0)
Display()方法不在父类中。这是错误。你是访问父类show方法而不是子类。如果你试图使用对象访问父类中的方法,你不需要子类中的方法