当前位置: 首页 > 面试题库 >

Java动态绑定和方法重写

仰英发
2023-03-14
问题内容

昨天我接受了两个小时的技术电话面试(我通过了,woohoo!),但是我完全想出了以下有关Java动态绑定的问题。令人困惑的是,几年前我曾当过助教时曾向大学生教授这一概念,所以我给他们提供错误信息的前景有点令人不安…

这是给我的问题:

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

html" target="_blank">html" target="_blank">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()方法中的两个单独的打印语句:att1.equals(t3)t3.equals(t3)。后一种情况是显而易见的,而在前一种情况下,即使t1具有Object类型的引用,也将其实例化为Test类型,因此动态绑定应调用该方法的重写形式。

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

我的问题是,为什么?正如我已经提到的,即使t1是对Object类型的引用(因此静态绑定将调用Object的equals()方法),动态绑定也应根据引用的实例化类型来调用方法的最特定版本。我想念什么?


问题答案:

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

它是equals方法的事实并不重要,除了重载而不是覆盖它是一个常见错误之外,您已经根据面试中对问题的回答知道了这一点。

编辑:这里也是一个很好的描述。本示例显示了与参数类型有关的类似问题,但是是由同一问题引起的。

我相信,如果绑定实际上是动态的,则在任何情况下调用方和参数都是Test实例的情况都将导致调用重写的方法。因此,t3.equals(o1)将是唯一无法打印的情况。



 类似资料:
  • 是否有可能静态解析被覆盖的方法? 调用虚拟绑定和动态绑定之间是什么关系?所有调用的虚拟方法都是动态绑定的吗? 这里x.display显示调用虚拟?这是什么意思?这意味着它是动态绑定的吗?

  • 问题内容: 昨天我接受了两个小时的技术电话面试(我通过了,woohoo!),但是我完全想出了以下有关Java动态绑定的问题。令人困惑的是,几年前我曾当过助教时曾向大学生教授这一概念,所以我给他们提供错误信息的前景有点令人不安… 这是给我的问题: 我断言输出应该是覆盖法中的两个单独的打印语句:和。后一种情况足够明显,而在前一种情况下,即使t1具有Object类型的引用,也将其实例化为Test类型,因

  • 问题内容: 我正在为测试做练习,并且遇到了有关重载以及静态和动态绑定的练习。询问以下代码的输出: 我 认为 我获得了第一个,但在其他方面我完全迷失了。这是我解决第一个问题的方法: 在运行时,类型为,因此我们调用Curly的print方法。由于我们传递了要打印的类型的对象,因此在中运行了具有参数类型的相应打印方法。该方法的输出为,正确答案。 但是,当我将这种技术应用于以下几行时,我得到的答案是错误的

  • 我想我得到了第一个,但在其他方面我完全迷失了。我是这样解决第一个问题的: 在运行时,的类型是,所以我们调用curly的print方法。因为我们将类型的对象传递给print,所以相应的参数类型为的print方法在中运行。此方法的输出是,正确答案。 然而,当我将此技术应用到以下行时,我最终得到了错误的答案。有人能解释一下这个概念在Java中到底是如何工作的吗? 代码的正确输出是:

  • 本文向大家介绍浅谈Java中的重载,重写,多态,静态绑定、动态绑定,包括了浅谈Java中的重载,重写,多态,静态绑定、动态绑定的使用技巧和注意事项,需要的朋友参考一下 本文主要研究的是关于Java中重载,重写,多态,静态绑定、动态绑定的相关内容,具体如下。 重载,英文名是overload,是指在一个类中定义了一个以上具有相同名称的方法,这些方法的参数个数、参数类型和顺序不能相同。返回类型可以相同,

  • 本文向大家介绍java动态绑定和静态绑定用法实例详解,包括了java动态绑定和静态绑定用法实例详解的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了java动态绑定和静态绑定用法。分享给大家供大家参考,具体如下: 背景 1.当子类和父类存在同一个方法,子类重写了父类的方法,程序在运行时调用的是父类的方法还是子类的重写方法呢(尤其是存在向上类型转换的情况)? 2.当一个类中存在方法名相同但参数