[英]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.