动态绑定问题

时间:2018-12-19 10:10:03

标签: java binding overloading

我真的试图理解它,但我不明白。为什么打印两次: 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);
    }
}

3 个答案:

答案 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

继承时,它将成为一个子类,因此如果您将子类分配给父类,则该类型将是兼容的。

如果您不继承,则可能会引发一些不兼容的错误。

调用重载的方法时,它将寻找相同的类型并执行两次,将第一个方法打印两次。