【发布时间】:2014-12-09 13:58:01
【问题描述】:
据我了解:
类的私有、最终和静态方法遵循编译时绑定,即在编译时决定调用哪个方法。
但是,对非私有实例方法的调用是在运行时决定的。
到目前为止,这曾经解决了我所有的问题。但是,我遇到了一些问题,即上述语句没有得到正确的输出。
代码如下:
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 在运行时拥有class Item 的对象,因此,应该调用Item class 的equals。在运行时,Item class 中有两个equals 方法,一个是它自己的,另一个是从Object 类继承的。所以,应该调用equals(Item) 而不是equals(Object),因为调用的是equals(Item)。
我在概念上到底缺少什么?
【问题讨论】:
-
如果您的期望是正确的,那么 Java 将是一种多分派语言,并且许多事情会更容易:) 另一方面,那么(多)方法在逻辑上将不再属于单课。
标签: java overloading overriding