Object在java中做了什么?

时间:2016-04-27 21:14:20

标签: java

我在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 ... 为什么会这样?发生了什么?

由于

4 个答案:

答案 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你传递给它的参数