调用等于("");自己编译运行

Calling equals(""); by itself compiles and runs

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

这样的东西
package voodoo;

public class Equals {

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

}

这是怎么回事,什么时候可以单独调用 equals()

如果我将其放入 JUnit 中进行测试,它会运行并通过。

因为所有东西都是 Object class 的 subclass,这里你调用 super class (Object) equals 方法。它接收 Object 作为参数,其中 "" 是一个字符串对象,它编译得很好。

其实是returnsboolean,只是你忽略了它才收到。忽略结果是合法的。

如果您收到并检查,returns false 因为您的 Equals class 不等于空字符串。

equals 是 non-static,它正在调用 Objectequals,这类似于调用 class 的任何其他方法。而且,我们的class是Object的child。方法调用类似于 thisObject.equals(emptyString) 注意这里 String 也是一个 Object。因此,最终我们从 Object 的 child 调用 currntObject.equals(object) 方法。

类似于,

class A {
    public boolean ok(Object str) {
        return false;
    }
}

class B extends A {

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

这里child没有覆盖equals所以,它会调用parent的方法,它会引用当前实例。

您正在调用的

equalsObjectequals 方法,可以在 this 引用上调用它而无需明确指定它。也就是说,你的调用相当于

this.equals("");

这是完全有效的,尽管行为良好的实施必须始终 return false。请注意,return 值被忽略,这也是合法的。

你可以通过用打印消息的东西覆盖 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);
    }
}

equals(...) 没有显式对象调用 this 上的方法。在您的示例中,您将 Equals 的实例与空字符串进行比较。

equals() public 方法位于 Object class。所有 class 默认情况下是 Object class 的 direct/indirect 个子 class。您的 Equals class 没有明确继承任何 class。所以它是 Object 的直接子 class。

在对象 class 中,方法 equals() 是这样声明的 -

public boolean equals(Object obj){}  

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