繁体   English   中英

为什么在父类中必须强制有一个子方法以引用父类的引用来调用它,该父类引用子类的对象?

[英]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() 在这种情况下,将a1B是合法的,如下所示:

((B)A1)。新增();

并且编译器不会抱怨。

您希望在声明的类型A的对象上调用方法,但仅在A的子类B中实现它。在这种情况下,通常将A作为抽象类,并在A中将add()声明为抽象方法。

好的答案...我对此也有疑问,但现在我很清楚:)还有一件事..您不必费力声明一个抽象方法,只需创建一个同名的空方法和父类中的签名和“瞧”,所有编译错误都消失了;)

在您的情况下,您可以像这样添加一个无效的add(){}方法,这样就不会有任何问题

暂无
暂无

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

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