我注意到在类的方法中调用equals("");
不会在Eclipse
内生成任何错误。我没见过.equals没有string1.equals(string2);
之类的话。
package voodoo;
public class Equals {
public void method(){
equals("");
}
}
这里发生了什么以及何时会使用equals()
本身?
如果我把它放到JUnit
进行测试,它会运行并通过。
答案 0 :(得分:16)
equals
是equals
的{{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()
。