为什么以下代码会出错?

时间:2016-04-23 05:16:04

标签: java inheritance

我正在尝试了解继承,我遇到了这个问题。

以下是代码:

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}的类定义中}

3 个答案:

答案 0 :(得分:7)

您必须了解运行时类型编译时类型之间的区别。

在运行时,变量p包含对Child实例的引用。因此调用show方法将运行Child#show中的代码,因为这会覆盖方法Parent#show

在编译时,编译器只能知道变量的声明的类型。这是Parent。因此,编译器只能允许访问Parent类型的字段和方法,但不能访问Child类型的字段和方法。

display方法根本没有在Parent中声明,因此错误。

答案 1 :(得分:1)

如果你想调用客户端的显示方法,那么你必须创建子类的对象。 例如。      儿童=新儿童();

否则你需要在父类中编写显示方法。

规则是孩子的父类无法召唤成员的参考。

答案 2 :(得分:0)

Display()方法不在父类中。这是错误。你是访问父类show方法而不是子类。如果你试图使用对象访问父类中的方法,你不需要子类中的方法