2 つのオブジェクトを比較する前に、まず何に基づいて比較するかを決定する必要があります。オブジェクトには非常に多くのメンバー変数があるため、直接比較することは不可能です
# 1.1 Comparableと Comparable
要素がクラスである配列の場合は、Comparator
class A implements Cloneable{ int i; int j; @Override protected Object clone() throws CloneNotSupportedException { return super.clone(); } @Override public String toString() { return "{" + "i=" + i + ", j=" + j + '}'; } }インスタンスを作成します。それを main メソッドで作成し、別のオブジェクトにクローンして結果を確認します: 現時点では、 b の変更により a は変更されていません。 clone()はディープ コピーです。クラス A:
class B implements Cloneable { int k; } class A implements Cloneable{ int i; int j; B c=new B(); @Override protected Object clone() throws CloneNotSupportedException { return super.clone(); } @Override public String toString() { return "{" + "i=" + i + ", j=" + j + ", c.k=" + c.k + '}'; } }を変換します。結果は次のとおりです。 この時点でクローンを作成します。それは深いコピーですか、それとも浅いコピーですか?
#この結果の理由はメモリに依存します。クラス A が変更される前のメモリは次のとおりです:
クラス A の変更されたメモリは次のとおりです。 :
上図によると、ディープコピーを実現するには、クラス B のコンテンツを再度クローンする必要があるため、clone メソッドを変更する必要があります
class B implements Cloneable { int k; @Override protected Object clone() throws CloneNotSupportedException { return super.clone(); } } class A implements Cloneable{ int i; int j; B c=new B(); @Override protected Object clone() throws CloneNotSupportedException { A tmp=(A)super.clone(); tmp.c=(B)this.c.clone(); return tmp; } @Override public String toString() { return "{" + "i=" + i + ", j=" + j + ", c.k=" + c.k + '}'; } }
なぜ自分で絵を描いてみるかについては、ここでは説明しません
一般的なものがいくつかあります。 Object クラスで使用されるメソッドをここで紹介します。
を紹介します。Object クラスでは、このメソッドはサイズを比較するために使用されます。戻り値はブール値です。基になる実装ロジックは次のとおりです。
public boolean equals(Object obj) { return (this == obj); }
「 == について、両辺の変数が基本型変数の場合は値が同じかどうか、参照型変数の場合は値が同じかどうかを比較します。
#3.2 toString出力ステートメントの最下層 System.out.println() は toString メソッドを呼び出しますが、出力が参照型データの場合は比較されません。の場合、デフォルトでは変更されたアドレスが出力されるため、この時点で書き換える必要があります(上記の例も同様です)。以上がJava 抽象クラスとインターフェイスを定義および使用する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。