2015-09-09 19 views
11

私は、クラスのメソッドでequals("");を呼び出してもEclipseの間にエラーが発生していないことに気付きました。私はstring1.equals(string2);のようなものなしで.equalsが呼ばれたことはありません。等号( "")を呼び出す。それ自身でコンパイルして実行します

package voodoo; 

public class Equals { 

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

} 

equals()は今までに何度も使用されていますか?

これをJUnitに入れてテストすれば、それは実行されてパスします。

+3

@WOUNDEDStevenJones:あなたはそれをどう思いますか? –

+0

この関数には何も問題はありません: 'public void answerToLifeTheUniverseAndEverything(){42; } '。あなたの '' equals( "" ")と同じように、ビットフロアに42が落とされます。 –

+2

@DavidHammenコンパイルされません。任意の式は、C++(ただしJavaではありません)(https://stackoverflow.com/questions/32406041/when-is-an-unassigned-expression-a-valid-statement)で有効な文です。 – Boann

答えて

16

equalsを明示的に指定せずにthis参照で呼び出すことができObjectequals方法、です。言い換えれば、あなたの呼び出しは行儀実装は常にfalseを返す必要がありますが、これは、完全に有効です

this.equals(""); 

に相当します。戻り値は無視されますが、これも合法です。あなたが実験の問題として、メッセージを出力し、何かを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); 
    } 
} 
+1

"正常に動作する実装は常にfalseを返さなければなりません"。本当に?独自の拡張された文字列クラス(おそらく余分なエンコーディング)を作成して、それを通常の文字列と比較できるようにすることはできませんか?引数のためだけです) – LS97

+9

@ 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」なので – dasblinkenlight

+0

OK、 'final'について知りませんでした。私は私の読書をすべきだと思います。 – LS97

5

すべてがObjectクラスのサブクラスなので、ここではsuper class(Object)equalsメソッドを呼び出しています。そして、Objectをパラメータとして受け取ります。""は文字列オブジェクトです。これはうまくコンパイルされます。

実際にはbooleanが返されますが、受信すると無視されます。結果を無視することは合法です。

Equalsクラスが空の文字列と等しくないため、受け取ってチェックすると、falseが返されます。

6

equalsは、非静的であり、Objectequalsを呼び出しています。これは、クラスの他のメソッドを呼び出すのと同様です。また、私たちのクラスはObjectの子です。メソッド呼び出しはthisObject.equals(emptyString)のようになります。StringObjectです。したがって、最終的にはObjectの子からcurrntObject.equals(object)メソッドを呼び出しています。ここでは子供がとてもequalsをオーバーライドされない

それは、

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

class B extends A { 

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

に似て、それはそれの方法は、親の呼び出しますし、それが現在のインスタンスを参照します。あなたが呼び出している

3

equals(...)明示的なオブジェクトなしではthis上のメソッドを呼び出します。あなたの例では、Equalsのインスタンスを空の文字列と比較しています。

2

equals()公開方法Objectクラスです。すべてのクラスはデフォルトで直接/間接の子クラスObjectクラスです。 Equalsクラスは明示的にクラスを継承しません。したがって、Objectの直接のサブクラスです。

とオブジェクトクラスにメソッドequals()は、次のように宣言されている -

public boolean equals(Object obj){} 

だからあなたのコードが完全に有効です。あなたは実際にEquals.equals()method()に呼び出しています。

関連する問題