我在java中有这个代码,我不明白以下代码中Object的含义...
这是代码
public class Tester {
public static void main(String[] args) {
Foo foo1 = new Foo(1);
Foo foo2 = new Foo(2);
System.out.print(foo1.equals(foo2));
}
}
class Foo {
Integer code;
Foo(Integer c) {
code = c;
}
public boolean equals(Foo f) {
return false;
}
public boolean equals(Object f) {
return true;
}
}
当我运行代码时,我得到false
但是当我删除
public boolean equals(Foo f) {
return false;
}
并运行我得到的代码true
...
为什么会这样?发生了什么?
由于
答案 0 :(得分:3)
这是method overloading resolution
。候选方法有两种,一种是Object
,另一种是Foo
,当你传递一个Foo时,将会调用most specific
方法(采用Foo的方法)。 / p>
当您删除采用Foo的方法时,您不再有过载,因为Foo
是Object
(与Java中的任何类一样) )该方法将接受它。
答案 1 :(得分:1)
方法重载。在运行时选择最具体的方法。
根据Language specification,大多数特定方法在运行时选择。
如果多个成员方法都可访问并适用于方法调用,则必须选择一个为运行时方法调度提供描述符。 Java编程语言使用选择最具体方法的规则。
因为选择了大多数具体方法,你会变得虚假。这就是原因
public boolean equals(Foo f) {
return false;
}
此方法调用并返回false。删除此方法时,
public boolean equals(Object f) {
return true;
}
这被调用,因为每个Foo都是Object。
答案 2 :(得分:1)
因为编译器将调用与参数匹配的最具体的方法。当equals(Foo)
比equals(Object)
更具体时。当您移除equals(Foo)
时,equals(Object)
是唯一仍然有效的方法。值得注意的是,Foo
具有隐式父类java.lang.Object
。
答案 3 :(得分:-1)
我认为你不是,真的理解面向对象的编程,你应该得到一本关于OOP的书来理解这些概念。查看it-ebboks.com获取一些有用的书籍
objact是一个班级的实例,例如一个学生提供相同科目的课堂,如果john doe是该班级的一个memebr,他提供该班级的课程,他是该班级的一个实例< / p>
public boolean equals(Foo f) {
return false;
}
返回false no mattter你传递给它的参数