在Java中,重载方法在编译时使用静态绑定进行绑定,而重写方法在运行时使用动态绑定进行绑定。我正在尝试了解此问题中的动态和静态绑定。
class A {
public void foo(Object o) {
System.out.println("A");
}
}
class B {
public void foo(String o) {
System.out.println("B");
}
}
class C extends A {
public void foo(String s) {
System.out.println("C");
}
}
class D extends B {
public void foo(Object o) {
System.out.println("D");
}
}
class Test {
public static void main(String[] args) {
A a = new C();
a.foo("Java");
C c = new C();
c.foo("Java");
B b = new D();
b.foo("Java");
D d = new D();
d.foo("Java");
}
}
输出:
A
C
B
B
在
A a = new C()
行中,我知道foo
是一个重载函数。重载函数在编译时解决,并使用静态绑定进行绑定。我们知道静态绑定使用Type。我的问题是哪种类型?键入该函数调用的(a.foo("Java")
)参数类型还是类的A
类型?如果是班级类型,请在下面关注我。在
D d = new D()
行中,foo再次成为重载函数。重载的函数绑定的静态绑定和静态绑定使用Type。如果我们确定类的类型,则需要打印D
,但它正在打印B
。您能解释一下这种行为以及我以前的问题吗?
最佳答案
方法签名由参数的静态类型确定。具体方法是在运行时通过动态绑定动态选择的(但必须符合编译时确定的方法签名)。一个例子:
class Ideone {
public static void main (String[] args) {
String s = "bar";
Object o = s;
Ideone ideone = new Idetwo();
ideone.foo(s);
ideone.foo(o);
}
public void foo(String s) {
System.out.println("Ideone: String");
}
public void foo(Object o) {
System.out.println("Ideone: Object");
}
}
class Idetwo extends Ideone {
@Override
public void foo(Object o) {
System.out.println("Idetwo: Object");
}
}
Ideone demo
变量
s
具有静态类型String
,因此称为foo(String s)
。变量o
具有静态类型Object
,因此称为foo(Object o)
。在这两种情况下,都是动态选择具体方法。因此,当执行ideone.foo(o);
时,将调用foo(Object o)
的Idetwo
而不是foo(Object o)
的Ideone
。
关于java - 方法绑定(bind)中的异常行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59603584/