有关多态性的代码段。为什么以下导致编译错误?

时间:2019-03-08 01:21:48

标签: java polymorphism

为什么以下代码会导致编译错误?由于它是一个GeeksforGeeks对象,因此不应使用类GeeksforGeeks中的getValue()方法。我在基类中添加了getValue()方法,并编译了代码。这是什么原因呢?

class GFG 
{ 
    protected void getData() 
    { 
        System.out.println("Inside GFG"); 
    } 
} 

class GeeksforGeeks extends GFG 
{ 
    protected void getData() 
    { 
        System.out.println("Inside GeeksforGeeks"); 
    } 

    protected void getValue() 
    { 
        System.out.println("GeeksforGeeks"); 
    } 
} 

public class Test 
{ 
    public static void main(String[] args) 
    { 
        GFG obj = new GeeksforGeeks(); 
        obj.getValue(); 
    } 
}

3 个答案:

答案 0 :(得分:0)

这里的问题是getValue()方法仅存在于GeeksForGeeks子类中,而不存在于父类CFG中。在您的代码中,您将obj定义为父类类型。

这里的一种解决方法是只给CFG一个getValue()方法:

class GFG {
    protected void getData() {
        System.out.println("Inside GFG");
    }

    protected void getValue() {
        // do something
    }
}

通过将getValue()的任何实现添加到CFG类中,您将完成继承链,然后Java应该在GeeksForGeeks子类中调用重载版本。

答案 1 :(得分:0)

这是因为obj的引用变量的类型为GFG,并且该类没有getValue()方法。如果将参考变量更改为GeeksForGeeks,它将起作用。

答案 2 :(得分:0)

您将obj声明为GFG对象。 GFG 不包含getValue()方法。

重要的是要了解父对象不会从其子对象继承。因此,尽管GeeksForGeeks是{strong>是GFG,而GFG不是{strong>是GeeksForGeeks(就像{{ 1}}是Buick,但不是每个Car都是Car)。

将行更新为Buick或将GeeksForGeeks obj = new GeeksForGeeks();方法移至getValue()类中,您将下雨了。


您应该考虑一下您的设计。每个扩展GFG的类都需要一个GFG方法吗?如果是这样,他们都将做同样的事情,则该方法属于getValue()类。

但是,假设您希望GFG的每个子代在调用GFG时运行自己的代码。然后,您仍然希望在getValue()中声明getValue(),但是您可以在GFG类中覆盖它:

GeeksForGeeks

这是对继承的过于简单的解释,但是应该引导您朝着正确的方向前进,因为在该主题上有很多东西可以学习。

  

侧面说明::您的@Override public void getValue(){ // Code here } 方法实际上没有getValue()任何东西;这将是一个令人困惑的实现;调用者从该方法中得到的是什么?