java - 方法绑定(bind)中的异常行为

标签 java oop binding

在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/

相关文章:

java - 手动创建Resultset/CachedRowSet

c# - 对象 A 引用了对象 B,而对象 B 将对象 A 作为公共(public)属性 - 设计不好?

c# - 如何将 ValueConverter 应用于基于约定的 Caliburn.Micro 绑定(bind)示例?

wpf - 设计时 XAML 的默认值

java - 使用 super AND 实例变量的构造函数

Javascript 函数调用和绑定(bind)

java - 如何在java中读取和提取图像像素并进行比较

java - Android 抽屉布局未显示

java - 堆书盒包装

powershell - 在Powershell中将对象属性添加到另一个对象