为什么以下代码会导致编译错误?由于它是一个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();
}
}
答案 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()
任何东西;这将是一个令人困惑的实现;调用者从该方法中得到的是什么?