我想知道为什么Java在方法参数中没有动态绑定?例:
static class C {
public static void test(C c) {
System.out.println("C");
}
}
static class D extends C {
public static void test(D d) {
System.out.println("D");
}
}
public static void main(String[] args) {
C c = new D();
D d = new D();
test(c);
无论如何,必须确定变量c是包含类C的实例还是其子类的实例,那么为什么不能动态地完成它呢?
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
在Java中,方法的调用,包括静态方法和实例方法,遵循不同的规则。您提到的情况涉及的是静态方法(static method),而动态绑定(也称为迟绑定或运行时绑定)是针对实例方法的一种机制。
静态方法:属于类本身,不属于任何特定的对象实例。它们不依赖于对象的状态,可以直接通过类名调用,不需要实例化对象。因此,静态方法的调用在编译时期就已经确定,即根据引用变量声明的类型来决定调用哪个方法,这就是所谓的静态绑定或早期绑定。在您的例子中,test
方法都是静态的,所以无论传递什么类型的实例,调用哪个方法完全由其引用的静态类型决定。
动态绑定(晚绑定):这是针对非静态方法(实例方法)的机制。当一个对象调用一个实例方法时,Java虚拟机(JVM)会根据对象的实际类型(即运行时类型)来选择合适的方法版本执行。这意味着如果子类重写了父类的方法,那么通过父类引用来调用该方法时,实际执行的是子类的方法实现。这种在运行时决定调用哪个方法的过程就是动态绑定。
C c = new D();
D d = new D();
test(c);
在这个例子中,尽管 c
实际上指向的是 D
的实例,但因为 test
是静态方法,它的调用依据的是引用变量 c
的声明类型 C
,而不是实际类型 D
。因此,它会调用 C.test(C c)
而不是 D.test(D d)
。如果您希望根据实际类型来调用方法,应考虑使用实例方法并覆写该方法。