【问题标题】:Dynamic binding concern动态绑定关注点
【发布时间】:2018-12-19 10:10:02
【问题描述】:

我真的很想理解它,但我无法理解。为什么会打印:Selected: method 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);
    }
}

【问题讨论】:

    标签: java binding overloading


    【解决方案1】:

    您的示例不是动态绑定。它是静态绑定,您可以在链接中查看示例

    See here

    在您的示例中,编译时会很清楚将执行哪个方法。这就是它是静态绑定的原因。

    动态绑定是在运行时决定的。

    例如在给定的链接中,如果你看到 =>

    在运行时,start() 处的程序将知道 Car 类的方法将被执行。

    另外你还可以看到 Liskov Substitution Principle

    如果 S 和 T 是对象,并且 T 是 S 的子类型,则可以使用 T 其中 S 是预期的。

    【讨论】:

      【解决方案2】:

      一些关键点是:

      • 你已经重载了方法methodModule
      • 你正在继承classOne

      当你继承时,它变成了一个子类,所以如果你将子类分配给你的父类,类型将是兼容的。

      如果不继承,可能会抛出一些不兼容的错误。

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

      【讨论】:

        【解决方案3】:

        你的类Module中有方法methodModule重载

        虽然您通过ClassOne c2 = new ClassTwo();c2 分配了一个ClassTwo 对象,但是由于c2 被声明为对ClassOne 对象的引用,所以在执行m.methodModule(c2); 时将选择methodModule(ClassOne c) 方法.

        请参阅下面的动态绑定代码,它会输出您的预期结果:

        Selected: method 1
        Selected: method 2
        

        在这个代码示例中,使用了Overriding,通常与动态绑定有关:

        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();
            }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-10-29
          • 1970-01-01
          • 2020-06-19
          • 1970-01-01
          • 2015-09-14
          • 1970-01-01
          相关资源
          最近更新 更多