Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 呼叫等于(“呼叫”);自行编译和运行_Java_Equals - Fatal编程技术网

Java 呼叫等于(“呼叫”);自行编译和运行

Java 呼叫等于(“呼叫”);自行编译和运行,java,equals,Java,Equals,我注意到调用等于(“”)在Eclipse中没有生成任何错误。我从未见过调用时没有类似string1.equals(string2)的东西 这里发生了什么?什么时候可以单独调用equals() 如果我把它放到一个JUnit中进行测试,它会运行并通过。因为所有东西都是对象类的子类,所以这里您调用的是超类(Object)equals方法。它将对象作为参数接收,其中“是字符串对象,它可以很好地编译 它实际上返回布尔值,但您忽略它来接收。忽略结果是合法的 如果您收到它并进行检查,则返回false,因为您的

我注意到调用
等于(“”)
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){}