【问题标题】:what does Object do in java? [duplicate]对象在java中做了什么? [复制]
【发布时间】:2016-08-22 09:53:04
【问题描述】:

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

谢谢

【问题讨论】:

标签: java


【解决方案1】:

这是method overloading resolution。有两种候选方法,一种采用Object,另一种采用Foo,当您传递Foo时,将调用most specific方法(采用Foo的方法)。

当您删除采用 Foo 的方法时,您将不再有重载,因为 Foo Object(与 Java 中的任何类一样)该方法将接受它.

【讨论】:

    【解决方案2】:

    方法重载。在运行时选择最具体的方法。

    根据Language specification 最具体的方法在运行时选择。

    如果多个成员方法既可访问又适用于方法调用,则有必要选择一个为运行时方法分派提供描述符。 Java 编程语言使用选择最具体方法的规则。

    因为选择了最具体的方法,所以您弄错了。这就是原因

     public boolean equals(Foo f) {
            return false;
        }
    

    此方法调用并返回 false。当您删除此方法时,

     public boolean equals(Object f) {
            return true;
        }
    

    之所以调用它,是因为每个 Foo 都是 Object。

    【讨论】:

      【解决方案3】:

      因为编译器将调用匹配参数的最具体方法。当您拥有比equals(Object) 更具体的equals(Foo) 时。当您删除 equals(Foo) 时,equals(Object) 是唯一仍然有效的方法。还值得注意的是Foo 有一个隐式父类java.lang.Object

      【讨论】:

        【解决方案4】:

        我认为你并不真正了解面向对象的编程,你应该买一本关于 OOP 的书来理解这些概念。查看 it-ebboks.com 以获取一些有用的书籍

        一个对象是一个类的实例,例如一个学生的教室提供相同的科目,如果 john doe 是该类的成员,他提供该类的课程,他是该类的一个实例

        public boolean equals(Foo f) {
            return false;
        }  
        

        无论你传入什么参数都返回 false

        【讨论】:

          猜你喜欢
          • 2021-09-05
          • 2016-01-14
          • 2012-01-26
          • 2016-05-09
          • 2020-11-10
          • 2012-08-01
          • 1970-01-01
          • 1970-01-01
          • 2015-09-16
          相关资源
          最近更新 更多