gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 14:19:17 25 4
gpt4 key购买 nike

据我了解:

类的私有(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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com