Java 动态绑定(bind)和方法覆盖

标签 java inheritance dynamic-binding

昨天我有一个两个小时的技术电话面试(我通过了,哇哦!),但我完全忽略了以下关于 Java 中的动态绑定(bind)的问题。更令人费解的是,几年前我还是一名助教时曾向本科生教授这个概念,所以我给他们错误信息的前景有点令人不安......

这是我遇到的问题:

/* What is the output of the following program? */

public class Test {

  public boolean equals( Test other ) {
    System.out.println( "Inside of Test.equals" );
    return false;
  }

  public static void main( String [] args ) {
    Object t1 = new Test();
    Object t2 = new Test();
    Test t3 = new Test();
    Object o1 = new Object();

    int count = 0;
    System.out.println( count++ );// prints 0
    t1.equals( t2 ) ;
    System.out.println( count++ );// prints 1
    t1.equals( t3 );
    System.out.println( count++ );// prints 2
    t3.equals( o1 );
    System.out.println( count++ );// prints 3
    t3.equals(t3);
    System.out.println( count++ );// prints 4
    t3.equals(t2);
  }
}

我断言输出应该是来自重写的 equals() 方法中的两个单独的打印语句:在 t1.equals(t3)t3 .equals(t3)。后一种情况很明显,前一种情况下,即使 t1 有一个 Object 类型的引用,它也被实例化为 Test 类型,所以动态绑定(bind)应该调用方法的覆盖形式。

显然不是。我的面试官鼓励我自己运行程序,你瞧,被覆盖的方法只有一个输出:在 t3.equals(t3) 行。

那么我的问题是,为什么?正如我已经提到的,即使 t1 是 Object 类型的引用(因此静态绑定(bind)会调用 Object 的 equals() 方法),动态绑定(bind) 应该 注意根据引用的实例化类型调用最具体的方法版本。我错过了什么?

最佳答案

Java 对重载方法使用静态绑定(bind),对重载方法使用动态绑定(bind)。在您的示例中,equals 方法被重载(具有与 Object.equals() 不同的参数类型),因此调用的方法在编译时绑定(bind)到 reference 类型。

一些讨论here

它是 equals 方法这一事实并不真正相关,除了重载而不是覆盖它是一个常见的错误,根据你在面试中对问题的回答,你已经意识到了这一点。

编辑: 很好的描述here也是。此示例显示了与参数类型相关的类似问题,但由同一问题引起。

我相信如果绑定(bind)实际上是动态的,那么调用者和参数是 Test 实例的任何情况都会导致调用被覆盖的方法。所以 t3.equals(o1) 将是唯一不会打印的情况。

关于Java 动态绑定(bind)和方法覆盖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/321864/

相关文章:

java - 使用 Action 监听器

c++ - 错误消息 "undefined reference to template function passed as template parameter"

java - 在 Scala 中使用 Java 接口(interface)时,编译器提示方法未实现

java - 为什么动态绑定(bind)在这里不适用?

java - 当基类被重写时,如何从另一个方法调用基类自己的方法?

c# - C# 中的动态绑定(bind)

java - Spring Security 两个authenticationSuccessHandler

java - 通过 TCP 连接到 3G 移动设备

java - 如何将SVN分支合并到主干?

java - 调用父类(super class)的构造函数不起作用