Java 呼叫等于(“呼叫”);自行编译和运行
我注意到调用Java 呼叫等于(“呼叫”);自行编译和运行,java,equals,Java,Equals,我注意到调用等于(“”)在Eclipse中没有生成任何错误。我从未见过调用时没有类似string1.equals(string2)的东西 这里发生了什么?什么时候可以单独调用equals() 如果我把它放到一个JUnit中进行测试,它会运行并通过。因为所有东西都是对象类的子类,所以这里您调用的是超类(Object)equals方法。它将对象作为参数接收,其中“是字符串对象,它可以很好地编译 它实际上返回布尔值,但您忽略它来接收。忽略结果是合法的 如果您收到它并进行检查,则返回false,因为您的
等于(“”)类的方法中的code>在Eclipse
中没有生成任何错误。我从未见过调用时没有类似string1.equals(string2)的东西代码>
这里发生了什么?什么时候可以单独调用equals()
如果我把它放到一个JUnit中进行测试,它会运行并通过。因为所有东西都是对象类的子类,所以这里您调用的是超类(Object)equals方法。它将对象作为参数接收,其中“
是字符串对象,它可以很好地编译
它实际上返回布尔值
,但您忽略它来接收。忽略结果是合法的
如果您收到它并进行检查,则返回false
,因为您的Equals
类不等于空字符串。Equals
是非静态的,它调用对象的Equals
,这类似于调用该类的任何其他方法。此外,我们的类是对象
的子类。方法调用类似于thisObject.equals(emptyString)
注意这里String
也是一个对象。所以,最终我们从对象的子对象调用currnObject.equals(object)
方法
类似于,
class A {
public boolean ok(Object str) {
return false;
}
}
class B extends A {
public void method(){
ok("");
}
}
在这里,子对象没有覆盖equals
,因此,它将调用其父对象的方法,并引用当前实例。equals
您正在调用的是对象的equals
方法,可以在此
引用上调用,而无需明确指定它。换句话说,你的电话相当于
this.equals("");
这是完全有效的,尽管行为良好的实现必须始终返回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);
}
}
equals(…)
没有显式对象调用此
上的方法。在您的示例中,您正在将Equals
的实例与空字符串进行比较。对象类中的Equals()
公共方法。默认情况下,“所有”类是对象的直接/间接子类。您的Equals
类没有显式继承任何类。因此它是对象
的一个直接子类
在对象类中,方法equals()
声明如下-
public boolean equals(Object obj){}
所以你的代码是完全有效的。实际上,您正在method()
处调用Equals.Equals()
“行为良好的实现必须始终返回false”。真正地难道我不能创建自己的增强字符串类(可能带有额外的编码)并允许将其与常规字符串进行比较吗?只是为了争论;)@LS97它会破坏,因为java.lang.String
对于任何不是java.lang.String
的东西都会返回false
,并且不可能生成java.lang.String
的子类,因为类是final
。好的,我不知道final
。我想我应该读一读。“一个表现良好的实现必须总是返回false
”,当然,除非您正在实现java.lang.String
。请记住,String
是一个普通Java类,其纯Java实现(至少在参考JRE实现中)为等于
。这是在传递“
…@LS97时唯一可以正确返回true
的实现:即使对于非final
类,这样做也是不正确的,因为扩展类实例和基类实例之间的比较永远不会对称。(除非基类是专门为此目的而设计的,比如允许与任意的List
实现进行比较的AbstractList
,但这需要一个关于所有实现都必须遵守的平等契约的确切说明)@WOUNDEDStevenJones:你为什么会这样想?这个函数也没有什么问题:公共无效回答iftheuniverseandeverything(){42;}
。42被放到位层,就像你的equals(“”
)@DavidHammen不会编译一样。任意表达式是C++中的有效语句。
public boolean equals(Object obj){}