据我了解:
类的私有(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 Item
的 equals
方法并没有覆盖 Object
的 equals
方法,而是重载了由于 equals
方法的方法签名不同而发生。
问题:在调用itemC.equals(itemB)
时,为什么调用Object
类的equals方法。
根据我的说法:itemC
在运行时具有类 Item
的对象,因此,等于
Item 类
应该被调用。在运行时,Item 类
中有两个equals
方法,一个是它自己的方法,另一个是从Object
类继承的。因此,应该调用 equals(Item)
而不是 equals(Object)
,因为该调用是针对 equals(Item)
的。
我在概念上到底缺少什么?
最佳答案
重载是在编译时确定的,而不是运行时确定的。因此,itemC.equals(itemB)
调用Object
的equals
方法,因为itemC
变量的类型是对象
。
关于java - 方法重载和重写中的编译时和运行时绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27380688/