繁体   English   中英

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

[英]Code segment concerning polymorphism. Why does the following result in a compilation error?

为什么以下代码会导致编译错误? 由于它是一个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(); 
    } 
}

这里的问题是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子类中调用重载版本。

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

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

重要的是要了解父对象不会从其子对象继承。 因此,尽管GeeksForGeeks GFG ,但GFG 并不是 GeeksForGeeks (就像Buick Car ,但并非每辆Car都是Buick )。

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


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

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

@Override
public void getValue(){
    // Code here
}

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

旁注:您的getValue()方法实际上不return任何内容。 这将是一个令人困惑的实现; 调用者从该方法中“得到”什么?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM