为什么必须在Parent类中使用子方法来调用父类的引用,而父类是指子类的对象?

时间:2009-08-30 13:37:52

标签: java

public class A
{  }

public class B extends A
{
  public void add()
  {
   System.out.println("add in B");
  }
}

现在,如果我们以下列方式调用add,那么它会出错: A a1 =新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

为什么会这样?

5 个答案:

答案 0 :(得分:2)

在a1.add()的方法调用中,编译器检查方法是否存在。但它只知道a1是对A类对象的引用,它没有该方法。所以编译失败了。

在这个简单的例子中,编译器可能很容易推断出正确的类型。但在更一般的情况下,它不会。因此,这种逻辑不是规范的一部分。

答案 1 :(得分:1)

因为java在编译时不知道a1将在运行时引用B的实例。它只知道声明的类型,因此它只允许使用声明类型的调用。

答案 2 :(得分:0)

当Java编译器查看引用a1时,它知道可用的方法。在您的第一个示例中,类A在其API中没有add()。在这种情况下,执行a1B的演员是合法的:

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

并且编译器不会抱怨。

答案 3 :(得分:0)

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

答案 4 :(得分:0)

答案很好......我对这个也有疑问,但现在我很清楚:) 还有一件事......你不必为了声明一个抽象方法而烦恼,只需在父类中创建一个具有相同名称和签名的空方法,并且“瞧”所有编译错误都消失了;)

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