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
为什么会这样?
答案 0 :(得分:2)
在a1.add()的方法调用中,编译器检查方法是否存在。但它只知道a1是对A类对象的引用,它没有该方法。所以编译失败了。
在这个简单的例子中,编译器可能很容易推断出正确的类型。但在更一般的情况下,它不会。因此,这种逻辑不是规范的一部分。
答案 1 :(得分:1)
因为java在编译时不知道a1将在运行时引用B的实例。它只知道声明的类型,因此它只允许使用声明类型的调用。
答案 2 :(得分:0)
当Java编译器查看引用a1
时,它知道可用的方法。在您的第一个示例中,类A
在其API中没有add()
。在这种情况下,执行a1
到B
的演员是合法的:
((B)A1)。新增();
并且编译器不会抱怨。
答案 3 :(得分:0)
您希望在声明类型为A的对象上调用方法,但仅在A的子类B中实现它。 在这种情况下,您通常会将A设为abstract class,并在A中声明add()一个抽象方法。
答案 4 :(得分:0)
答案很好......我对这个也有疑问,但现在我很清楚:) 还有一件事......你不必为了声明一个抽象方法而烦恼,只需在父类中创建一个具有相同名称和签名的空方法,并且“瞧”所有编译错误都消失了;)
在你的情况下,你可以像这样添加一个void add(){}方法,你就不会有任何问题