java - 方法重载和重写中的编译时和运行时绑定(bind)

标签 java overloading overriding

据我了解:

类的私有(private)、最终和静态方法遵循编译时绑定(bind),即调用哪个方法是在编译时决定的。

但是,对非私有(private)实例方法的调用是在运行时决定的。

这曾经解决了我迄今为止的所有问题。但是,我遇到了一些问题,上述语句没有得出正确的输出。

这是代码:

class Item
{
    Integer size;
    Item(Integer size)
    {
      this.size=size;
    }
    public boolean equals(Item item2) //not overriding the method of Object class
    {
        if(this==item2)
        return true;
        return this.size.equals(item2.size);
     }

  }

public class Test 
{
    public static void main(String[] args)
     {
        Item itemA= new Item(10);
        Item itemB= new Item(10);
        Object itemC=itemA;
        System.out.println("|"+ itemA.equals(itemB) + "|" + itemC.equals(itemB)+ "|");
     }

}

输出:|true|false|

我期望的输出:|true|true|

这里,class Itemequals 方法并没有覆盖 Objectequals 方法,而是重载了由于 equals 方法的方法签名不同而发生。

问题:在调用itemC.equals(itemB)时,为什么调用Object类的equals方法。

根据我的说法:itemC 在运行时具有类 Item 的对象,因此,等于 Item 类 应该被调用。在运行时,Item 类中有两个equals方法,一个是它自己的方法,另一个是从Object类继承的。因此,应该调用 equals(Item) 而不是 equals(Object),因为该调用是针对 equals(Item) 的。

我在概念上到底缺少什么?

最佳答案

重载是在编译时确定的,而不是运行时确定的。因此,itemC.equals(itemB)调用Objectequals方法,因为itemC变量的类型是对象

关于java - 方法重载和重写中的编译时和运行时绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27380688/

相关文章:

java - 如何在不显式使用构造函数的情况下生成不可变的 DTO?

C++广义运算符模板

Java重载方法选择

java - Java 中的动态转换

java - 如果相同的方法重载和覆盖,Java 中的意外多态行为

jQuery UI CSS 没有覆盖

php - 禁止重载 PHP 类构造函数

java - 相当于mockito中 spy 的Answers.RETURNS_DEEP_STUBS

java - Android tcp套接字设置etimedout值

java - 我怎样才能运行这个程序?