詳細なリストは、()メソッドが含まれている場合に注意を払うとequals()メソッドをオーバーライドする必要があります

http://blog.csdn.net/javazejian/article/details/51348320からの記事の抜粋

私たちは、内部の外観は達成するためのメソッドが含まれて取ります

@Override
パブリックブール含有(オブジェクトo){
リターンのindexOf(O)= -1!。
}
进入IndexOfメソッド方法

@Override
のindexOf(物体O)INT公衆{
E []は= this.a;
oは復帰位置セットでもある//ヌルヌル
IF(O == NULL){
(= 0をI int型のため、私はa.lengthを<; I ++の)
IF([I] == NULL)
リターンI;
}他{
//のindexOf()は、着信コールが実際に含まれている(オブジェクトo)は、メソッドの引数に等しい
ため( 0 = I値int; Iはa.lengthを<; I)が++
IF(o.equals([I]))
リターンI;
}
戻り-1、
一般的に我々に等しい()メソッドをオーバーライドしていない、それが呼び出されますオブジェクトクラスのequals()メソッドから継承された、と我々はすべてのequals()メソッドのオブジェクトを知っている、==以下の実際にあります

ブールはパブリック(オブジェクトOBJ)に等しい{
リターン(この==のOBJを);
}
比較は、同じオブジェクトかどうかです。それではコールは、()メソッドが含まれている、それは実際には同じオブジェクトであるかどうかを確認することですが、あなたは対等のパラメータ()メソッドが含まれています(オブジェクトo)をオーバーライドした場合、それは異なる結果を生成します。

そして、私たちすべては、あなたがequalsメソッドをオーバーライドした場合、これらの規則に従うことが必要である、知っています:

再帰性。Xについて、x.equals(x)は、任意の非ヌル基準値に対してtrueを返すべきです。

シンメトリー。以下のために任意の非ヌル参照値xとy、IFF:真のみy.equals(X)を返し真について、x.equals(y)を返します。

推移。任意の非ヌル参照値x、yおよびzは、y.equals(x)がtrueを返す場合、y.equals(z)が真で、次いでx.equals(z)を返すためにtrueを返すべきです。

一貫性。null以外の参照値xとyのために、比較情報は、複数の呼び出しのx.equals(y)は常にtrueを返すか、常にfalseを返し、オブジェクトが変更されていないと仮定等しいです。

任意の参照値xについて、x.equal(ヌル)がfalseを返すべきです。

以下の例は以下のとおりです。

輸入はjava.util.ArrayList;
輸入はjava.util.List;

{クラスAbnormalResult公共
のpublic static無効メイン(文字列[] args){
一覧リストArrayListの新しい新= ();
A = A新しい新しいA();
B = B新しい新B();
List.add(A)
のSystem.out。 println( "list.contains(A) - >" + list.contains(A))
のSystem.out.println( "list.contains(B) - >" + list.contains(B));
list.clear( );
List.add(B)
のSystem.out.println( "list.contains(A) - >" + list.contains(A))
のSystem.out.println( "list.contains(B) - >" list.contains +(B));
}
//我々は内部の静的クラスコードを合理化し、我々はコールが含まためには、私たちの対等に追従するときように、equalsメソッドは、リストに挿入された要素を書き換えることがわかります動作の方法
静的クラスA {
@Override
パブリックブール等しい(オブジェクトOBJ)は{
objをinstanceofのを返します。
}
}
静的クラスA {延びBでは
@Override
パブリックブール{等しい(オブジェクトOBJ)
のinstanceofのOBJのBを返す;
}
}
}
我々は、出力されることがわかります。

list.contains(A) - >真

list.contains(B) - >偽

list.contains(A) - >真

list.contains(B) - >真

どうやらこれは、問題はありませんが、我々は唯一の4は、上記の()メソッドの呼び出しが含まれているための方法は、それが対称書き換えの原則は、()メソッドに等しい違反していることがわかります等しいこれを見た場合、(実際の呼び出しに等しいです。次のように)方法があります。

①a.equals(A) - >真; //我々は唯一の要素を挿入するので、この要素の挿入、以下同じと比較しているので

②b.equals(A) - >偽。

③a.equals(B) - >真。

④b.equals(B) - >真。

②③比較の結果が異なっており、これは対称性の原則に違反して見ることができます。だから、あなたが書き換えしようとしているときは()メソッドは等しい()ルールを含む、上記の原則の遵守は、使用前に検証するかどうかを明確に確認してください。

上記のコードは次のように、それはtrueを返します変更されました

クラスB延び{静的
@Override
パブリックブール等しい(オブジェクトobj){
IF(instanceofのBはobjが){
trueに戻ると、
}
戻りsuper.equals(OBJ);
}
}
実際には、この方法は転送の原理に違反します、そのようなAの次の例

//父类
パブリッククラスPerson {
保護された文字列の名前。
パブリック文字列のgetName(){
名前を返します。
}
公共ボイドのsetName(文字列名){
this.name =名。
}
公共人(文字列名){
this.name =名。
}
パブリックブール等しい(Objectオブジェクト){
IF(対象者のinstanceof){
人P =(人物)オブジェクト。
もし(p.getName()== nullの||名== nullの){
falseを返します。
}
他{
戻りname.equalsIgnoreCase(p.getName())。
}
}
falseを返します。
}
}
//子类
パブリッククラス従業員は、個人を{延び
プライベートint型のID。
公共INTのgetId(){
IDを返します。
}
公共ボイドSETID(int型のID){
this.id = ID。
}
公務員(文字列名、int型のID){
スーパー(名);
this.id = ID。
}
/ **
*重写等号()方法
* /
パブリックブール等しい(Objectオブジェクト){
IF(従業員のinstanceofオブジェクト){
従業員E =(従業員)オブジェクト。
super.equals(オブジェクト)&& e.getId()== IDを返します。
}
super.equals(オブジェクト)を返します。
}
//测试代码
パブリッククラスTest {
パブリック静的な無効メイン(文字列[] args){
従業E1 =新しい従業員(「chenssy」、23);
新新E2は、従業員に従業員( "chenssy"、24)=;
人P1は人新新( "chenssyを")=;
System.out.printlnは(p1.equals(E1));
System.out.printlnは(p1.equals(E2) );
System.out.printlnは(e1.equals(E2));
}
}
転送の原理に従って、e1.equals(E2)は、E1 = E2のため、実際の結果が偽であるものの、trueを返す必要があり、我々は理解することは非常に簡単です!彼らは名前を比較する必要がなく、IDを比較する必要がないためだけで。しかし、それは、P1、E1に等しいE1、E2は、2つの異なるクラスが明らかにされているので、また非常に奇妙であるE2、に等しいですが、これはなぜ起こるのでしょうか?まずp1.equalsは(E1)、あるメソッド呼び出しP1に等しく、我々はinstanceofは見Personクラスは、かどうかを確認するためのinstanceofキーワードE1を用いた方法:インスタンスのオブジェクトが右のクラスに左かどうかを判断するためには、あなたがすることもできますサブクラスの実装のインスタンスは、親クラスを継承するかどうかを決定するために使用されます。彼らは両方の継承を存在し、名前と同じなので、その結果、両方のは確かに真実である一方で、間違いなく、trueを返します。したがって、上記の状況では、それは私たちを導く非常に簡単で、キーワードのinstanceofを使用することです「行き止まりに。」それははgetClassオーバーライドを使用することを推奨されている場合タイプ決意に等しいです。代わりにinstanceofを使用する(統一セマンティックを持つサブクラスでない限り)

getClass()は()クラスが同じであるかどうかを決定する方法が、instanceofのある(等号上記場合)か否かの継承関係を決定し、(instanceofの内部から)(object.getClassを置き換える)== Employee.class、ありませんfalseを返すので、これらの問題があるでしょう。

著者:shenqueying
出典:CSDN
オリジナル:https://blog.csdn.net/shenqueying/article/details/80073140
著作権:この記事はブロガーのオリジナルの記事、再現され、ボーエンのリンクを添付してください!

おすすめ

転載: blog.csdn.net/sjn0815/article/details/91956269