为什么下面的代码给出错误?

问题描述:

我想了解继承,并且遇到了这个问题。为什么下面的代码给出错误?

下面是代码:

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()继承并且还存在于类别定义Child class.

+0

'display()'在父类中不存在... – Li357

+0

请参阅'p'的基类型。 – Satya

你必须了解运行时间类型编译时间类型

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

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

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

Display()方法不在父类中。 t是错误的。你是访问父类的显示方法不是子类。如果你正试图访问父类中的方法,你不需要子类中的方法

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

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

规则是父类不能调用子成员的引用。