背景紹介
等しいメソッドは次のように機能します。
equals() は、2 つのオブジェクトが等しいかどうか、つまり 2 つのオブジェクトの内容が等しいかどうかを確認するために使用されます。
equals メソッドは、String クラスによってそのスーパークラスObject から継承されます。
== には、参照を比較する場合とプリミティブ データ型を比較する場合に異なる機能があります。
プリミティブ データ型を比較し、2 つの値が同じ場合に true を返します
一方、参照を比較する場合、参照がメモリ内の同じオブジェクトを指している場合、結果は true になります。
equals() メソッドはオブジェクト クラスで定義されています。
public boolean equals(Object obj) {
return (this == obj);
}
研究室環境
ASUS VivoBook + Windows10 + IntelliJ IDEA 2021.3.2 (コミュニティ版) + JDK17
実験内容
char 型のメンバー x と double 型のメンバー y を持つ Value という名前のクラスを実装します。Value クラスの 2 つのオブジェクトの内容を比較するために、equals( ) を使用するときに、オブジェクトのすべてのメンバーが対応して等しいことが等価条件となるように、equals( ) メソッドをオーバーライド (オーバーライド) してください。
(1) 実験アイデア
① クラス Value を定義し、そのメンバー変数(含むがこれらに限定されない)を char 型変数 x と double 型変数 y に設定します。
②equalsメソッドは本来参照アドレスを比較するものですが、今度は2つのクラスの内容のメンバ変数に応じて内容を比較する必要があり、Valueクラスのオブジェクトについては他のValueクラスのオブジェクトと比較する必要があります。したがって、書き換えられたメソッドの戻り値はブール値であり、メソッド名は等しいとして予約され、パラメータ リストは Value クラス オブジェクト b になります。比較演算子「==」と「this」キーワードを使用して2つのクラスのメンバ変数を判定し、満たす場合はtrueを返し、満たさない場合はfalseを返します。
③ パラメータ化されたコンストラクタを追加することで、Value クラスのメンバ変数 x と y を初期化できます。
④クラス内にmainメソッドを定義し、比較用のインスタンスを作成します。
(2) 実験ソースコード
値クラス:
public class Value {
char x;
double y;
boolean equals(Value b) {
return (this.x == b.x) && (this.y == b.y);
}
Value(char m,double n){
this.x=m;
this.y=n;
}
public static void main(String[] args) {
Value classOne = new Value('x',2.5);
Value classTwo = new Value('x',2.5);
System.out.println(classOne.equals(classTwo));
}
}
(3) 実験のスクリーンショット
(4) 実験体験
この質問には 2 つの困難があります。
最初の難関はequalsメソッドの書き換え判定です。メンバ変数を比較することでクラスの内容を比較する必要があり、「==」そのものでは参照オブジェクトの内容を比較することはできませんが、基本型charとdoubleについては「==」で内容の比較が可能です。そこで、equalsメソッドでは「==」を使って基本型の内容を比較し、クラスのインスタンス比較を実現します。
2 番目の困難はインスタンスの作成です。クラス作成時にメンバ変数の値を指定してしまうと比較の意味がなくなってしまいます。コンストラクターを作成すると、ユーザーは Value クラスの 2 つのインスタンスのメンバー変数値を自分で入力できるようになり、プログラムの正確性を検証しやすくなります。
(5) 実験のポイント
ここには、書き換え、インスタンスのクラスの判断、ダウンキャストという 3 つの知識ポイントが関係しています。
オーバーライドとは、親クラスと同じメソッド名、戻り値の型、パラメーター リストを持つメソッドをサブクラスに定義することですが、メソッドの実装プロセスは異なります。ここで注意が必要なのは、サブクラスで書き換えられたメソッドのアクセス権限は増加のみで減少はできないことです Objectクラスのequalsメソッドのアクセス権限はpublicなので、equalsメソッドのアクセス権限はValuez で書き換えられたものは公開のみ可能です。
インスタンスのクラスがValueであるかどうかの判定は、この実験のプログラムでは obj.getClass()==this.getClass() で判定していますが、 obj instanceof Value を使って判定することもできます。
最初にアップキャストされたオブジェクトのみがダウンキャストを続けることができます。親クラスによって参照されるオブジェクトが親クラスそのものである場合、ダウンキャスト処理中は安全ではなく、コンパイル時にエラーは発生しませんが、実行時に java.lang.ClassCastException エラーが発生します。
(CSDNブロガー「CN_BIT」より抜粋、リンク: https://blog.csdn.net/CN_BIT/article/details/108778669 )