[英]Why is it mandatory to have a child method in Parent class to call it with a reference of parent class which is referring to an object of child class?
public class A
{ }
public class B extends A
{
public void add()
{
System.out.println("add in B");
}
}
现在在这里,如果我们通过以下方式调用add,则会产生错误:A a1 = new B; a1.add();
但是,当我们在类A中添加add()方法,然后以类似的方式调用时,子类的add()方法将被调用。
即
public class A
{
public void add()
{
System.out.println("add in A");
}
}
public class B extends A
{
public void add()
{
System.out.println("add in B");
}
}
呼叫:
A a1 = new B;
a1.add();
输出:
加B
为什么会这样呢?
在a1.add()的方法调用中,编译器将检查该方法是否存在。 但是它只知道a1是对不具有该方法的类A的对象的引用。 因此编译失败。
在这个简单的示例中,编译器可能会很容易推断出正确的类型。 但在更一般的情况下,事实并非如此。 因此,这种逻辑不属于规范的一部分。
因为java在编译时不知道a1在运行时将引用B的实例。 它仅知道声明的类型,因此仅允许使用声明的类型的调用。
当Java编译器查看参考a1
,它知道可用的方法。 在第一个示例中,类A
的API中没有add()
。 在这种情况下,将a1
为B
是合法的,如下所示:
((B)A1)。新增();
并且编译器不会抱怨。
您希望在声明的类型A的对象上调用方法,但仅在A的子类B中实现它。在这种情况下,通常将A作为抽象类,并在A中将add()声明为抽象方法。
好的答案...我对此也有疑问,但现在我很清楚:)还有一件事..您不必费力声明一个抽象方法,只需创建一个同名的空方法和父类中的签名和“瞧”,所有编译错误都消失了;)
在您的情况下,您可以像这样添加一个无效的add(){}方法,这样就不会有任何问题
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.