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

Dum*_*ats 11 java equals

我注意到调用equals("");类的方法不会产生任何错误Eclipse.我从来没有见过.equals没有像string1.equals(string2);.

package voodoo;

public class Equals {

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

}
Run Code Online (Sandbox Code Playgroud)

这里发生了什么,什么时候会equals()自己调用?

如果我把它放入JUnit测试中,它会运行并通过.

das*_*ght 16

equals您呼叫IS Objectequals方法,它可以在被称为this参考而不显式指定它.换句话说,你的电话相当于

this.equals("");
Run Code Online (Sandbox Code Playgroud)

这是完全有效的,尽管一个表现良好的实现必须始终返回false.请注意,忽略返回值,这也是合法的.

equals作为一个实验问题,您可以通过覆盖打印消息的内容来查看正在发生的事情:

public class Equals {

    public void method(){
        equals("");
    }
    @Override
    public boolean equals(Object other) {
        System.out.println("I am being compared to '"+other+"'");
        return super.equals(other);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • @ LS97它会打破[对称性要求](http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#equals(java.lang.Object)),因为`java .lang.String`会为任何不是`java.lang.String`的东西返回`false`,并且不可能创建`java.lang.String`的子类,因为该类是`final`. (9认同)

Cod*_*roc 6

equals是非静态的,它调用equalsObject类似于调用类的任何其他方法.而且,我们班是孩子的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("");
    }
}
Run Code Online (Sandbox Code Playgroud)

这里的孩子还没有重写equals话,它会调用的方法它的父,它会参照当前实例.


Sur*_*tta 5

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

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

如果你收到它并检查,那就返回,false因为你的Equals类不等于空字符串.