【发布时间】:2020-09-02 07:13:53
【问题描述】:
在下面的程序中,我在 A 类中的一个方法重载了 3 次,然后在子类 B 中,所有 3 个重载方法都被覆盖。
obj3 是一个具有引用类型 A(超类)和对象类型 B(子类)的对象,它在执行时从 B 调用方法,这是预期的行为。
由于此代码中同时存在重载和覆盖,这是否意味着它在编译时执行静态绑定(到 A 类中的匹配方法),然后在运行时执行动态绑定(到 B 类中的方法)。它们可以同时出现吗?
我的假设是,这是动态绑定的经典案例,因为我认为“绑定”意味着永久操作,但同行建议它是一起的(首先是静态的,然后是动态的)。
class A{
public void method(Integer n){
System.out.println("Integer: "+n);
}
public void method(String s){
System.out.println("String: "+s);
}
public void method(String s, Integer n){
System.out.println("String: "+s+" Integer: "+n);
}
}
class B extends A{
public void method(Integer n){
System.out.println("Integer(from B): "+n);
}
public void method(String s){
System.out.println("String(from B): "+s);
}
public void method(String s, Integer n){
System.out.println("String(from B): "+s+" Integer(from B): "+n);
}
}
public class Test{
public static void main(String[] args){
A obj1 = new A();
B obj2 = new B();
A obj3 = new B();
System.out.println("Integer form of method");
// Integer form of method
System.out.println("Ref A Obj A");
// Ref A Obj A
obj1.method(1);
// Integer: 1
System.out.println("Ref B Obj B");
// Ref B Obj B
obj2.method(2);
// Integer(from B): 2
System.out.println("Ref A Obj B");
// Ref A Obj B
obj3.method(3);
// Integer(from B): 3
}
}
【问题讨论】:
-
重载方法:编译时间(静态)。虚拟方法:运行时(动态)。
-
@paulsm4 是的,但是由于这个方法既是重载的又是虚拟的,有人告诉我,(静态和动态)绑定都会发生,在编译时是静态的,在运行时是动态的。他们的论点是“动态绑定”的含义是它改变了静态绑定方法的绑定。所以在上面的例子中,发生了从类 A 到方法(整数 n)的静态绑定,然后在运行时动态绑定到类 B 的方法(整数 n),这会覆盖之前的静态绑定。这是真的吗?
-
不是“非此即彼”。是“两者”。例如,“method(Integer n)”与“method(String s)”是在编译时根据arity 确定的。 A.method() 与 B.method() 在运行时动态选择。 两个“决定”必须为要调用的六种方法之一做出,
-
你是对的:重载是静态绑定的一个例子。 “静态方法”是另一个例子。我从来没有说过 :) 这里的重要一点是,您的代码示例说明了 Java 中的“静态”和“动态”绑定。幸运的是,我想你明白了:)
标签: java static-binding