呼叫等于("");单独编译并运行

时间:2015-09-09 18:36:59

标签: java equals

我注意到在类的方法中调用equals("");不会在Eclipse内生成任何错误。我没见过.equals没有string1.equals(string2);之类的话。

package voodoo;

public class Equals {

    public void method(){
        equals("");
    }

}

这里发生了什么以及何时会使用equals()本身?

如果我把它放到JUnit进行测试,它会运行并通过。

5 个答案:

答案 0 :(得分:16)

您呼叫的{p> equalsequals的{​​{1}}方法,可以在Object引用上调用,而无需明确指定。换句话说,您的通话等同于

equals

这是完全有效的,尽管行为良好的实现必须始终返回this。请注意,忽略返回值,这也是合法的。

您可以通过覆盖this.equals(""); 覆盖打印消息的内容来查看正在发生的事情,这是一个实验问题:

false

答案 1 :(得分:6)

equals是非静态的,它调用equals的{​​{1}},类似于调用该类的任何其他方法。而且,我们班是Object的孩子。方法调用类似于Object注意此处thisObject.equals(emptyString)也是String。所以,最终我们从Object的孩子那里调用currntObject.equals(object)方法。

类似于,

Object

这里的孩子没有覆盖 class A { public boolean ok(Object str) { return false; } } class B extends A { public void method(){ ok(""); } } 所以,它会调用它的父方法,它将引用当前实例。

答案 2 :(得分:5)

因为一切都是Object类的子类,所以你在这里调用超类(Object)equals方法。它接收Object作为参数,其中""是一个字符串对象,它编译得很好。

实际上它会返回boolean,但你忽略了接收它。忽略结果是合法的。

如果您收到并检查,则返回false,因为您的Equals类不等于空字符串。

答案 3 :(得分:3)

没有显式对象的

equals(...)会在this上调用该方法。在您的示例中,您将Equals的实例与空字符串进行比较。

答案 4 :(得分:2)

equals()班级的Object公开方法。默认情况下,所有类都是Object类的直接/间接子类。您的Equals课程没有明确地继承任何课程。所以它是Object的直接子类。

在Object类中,方法equals()被声明为这样 -

public boolean equals(Object obj){}  

所以你的代码完全有效。您实际上是在Equals.equals()致电method()