我真的试图理解它,但我不明白。为什么打印两次: Selected:方法1 ? 我认为应该打印
已选择:方法1
已选择:方法2
因为c2的真实类型是ClassTwo。请参见下面的代码。
public class ClassOne{}
public class ClassTwo extends ClassOne{}
public class Module {
public void methodModule(ClassOne c){
System.out.println("Selected: method 1");
}
public void methodModule(ClassTwo c) {
System.out.println("Selected: method 2");
}
}
public class TestModule {
public static void main(String[] args) {
Module m = new Module();
ClassOne c1 = new ClassOne();
ClassOne c2 = new ClassTwo();
m.methodModule(c1);
m.methodModule(c2);
}
}
答案 0 :(得分:0)
您的类methodModule
中的方法Module
已重载。
虽然您通过以下方式为c2
分配了ClassTwo对象:ClassOne c2 = new ClassTwo();
,但是由于c2
被声明为对ClassOne
对象的引用,因此methodModule(ClassOne c)
方法执行m.methodModule(c2);
时将被选中。
请参见以下用于动态绑定的代码,该代码将输出您期望的结果:
Selected: method 1
Selected: method 2
在此代码示例中,使用了覆盖,它通常与动态绑定有关:
class ClassOne extends Module{
@Override
public void methodModule(){
System.out.println("Selected: method 1");
}
}
class ClassTwo extends Module {
@Override
public void methodModule() {
System.out.println("Selected: method 2");
}
}
class Module {
public void methodModule() {
System.out.println("Selected: module mothod");
}
}
public class TestModule {
public static void main(String[] args) {
Module c1 = new ClassOne();
Module c2 = new ClassTwo();
c1.methodModule();
c2.methodModule();
}
}
答案 1 :(得分:0)
您的示例不是动态绑定。这是静态绑定,您可以在链接
中查看示例php ratchet websocket SSL connect?
在您编译的示例中,很明显将执行哪个方法。这就是为什么它是静态绑定。
动态绑定是在运行时决定的。
例如,在给定的链接中,如果看到=>
在运行时,将执行start()
类的Car
方法中的程序。
此外,您还可以看到Liskov替代原理
如果S和T是对象,并且T是S的子类型,则可以使用T 哪里应该有S。
答案 2 :(得分:0)
一些要点是:
methodModule
classOne
继承时,它将成为一个子类,因此如果您将子类分配给父类,则该类型将是兼容的。
如果您不继承,则可能会引发一些不兼容的错误。
调用重载的方法时,它将寻找相同的类型并执行两次,将第一个方法打印两次。