第一件事
它是方法覆盖吗?
不,因为要覆盖一个方法,您需要复制完整的方法签名,正如 Brian Agnew 的回答中指出的那样,正如我在下面解释的那样。
是否超载?
是的,方法“add”在 B 类中有一个重载的实现。
考虑以下代码:
class C{
public static void main(String args[]){
B a = new B();
a.add(2 , 3);
a.add(2.0 , 3.0);
}
}
class A {
public int add(int a , int b) {
System.out.print("INT ");
return a + b;
}
}
class B extends A {
public double add(double a , double b) {
System.out.print("Double ");
return a + b;
}
}
输出:INT 双
因此,代码中 Class B 中的方法重载了它从其父级继承的 add 方法
它使用静态绑定还是动态绑定?
这就是让我得出结论认为 OP 很困惑的原因。它是静态绑定,因为它是一个重载函数。考虑动态绑定的唯一方法是在以下场景中
class C{
public static void main(String args[]){
A a = new B();
a.add(2.0 , 3.0);
}
}
class A {
public int add(int a , int b) {
System.out.println("A : INT");
return a + b;
}
}
class B extends A {
public int add(int a , int b) {
System.out.println("B : INT");
return a + b;
}
public double add(double a , double b) {
System.out.println("Double");
return a + b;
}
}
输出:B:INT
在这里,父类 A 有一个契约,上面写着“我有一个整数的添加行为”。B 类继承了这种添加行为并使其更加具体,同时还提供了一种可以添加双打的新行为。但是 A 类“不知道这种行为”。
所以A类的对象“不能”添加双打。为此,您需要更具体的 A 对象类型,即 B 对象。