Java 抽象クラスとインターフェイスを定義および使用する方法

WBOY
リリース: 2023-05-05 19:43:05
転載
1471 人が閲覧しました

1. オブジェクトの比較

2 つのオブジェクトを比較する前に、まず何に基づいて比較するかを決定する必要があります。オブジェクトには非常に多くのメンバー変数があるため、直接比較することは不可能です

# 1.1 Comparable

はインターフェイスのパラメータであり、比較されるオブジェクトのタイプが含まれます。

このインターフェイスには、compareTo 抽象メソッドが 1 つだけあります。

Java 抽象クラスとインターフェイスを定義および使用する方法

このインターフェイスをクラスに実装した後、クラス間のサイズを比較できます

1.2 Comparator

これ インターフェースには抽象メソッド Compare があり、オブジェクトの比較にも使用されます。メソッドの構造は次のとおりです:

Java 抽象クラスとインターフェイスを定義および使用する方法

Java 抽象クラスとインターフェイスを定義および使用する方法

と Comparable インターフェイスの違いは、Comparator インターフェイスが Arrays クラスの sort メソッドのパラメーターとして使用できることです。

Java 抽象クラスとインターフェイスを定義および使用する方法

要素がクラスである配列の場合は、Comparator2. クローン オブジェクト

2.1 Cloneable

Thisインターフェイスは空のインターフェイスですが、クローンを作成するにはクラスでこのインターフェイスを実装する必要があります。オーバーライドされるメソッドは、オブジェクト クラスの clone() メソッドです。

IDEA で自動的に書き換えられる clone() メソッドは次のとおりです。

Java 抽象クラスとインターフェイスを定義および使用する方法

throws と次のステートメントは現在焦点ではないため、当面はスキップされます。

このメソッドの戻り値は Object であるため、クラスを使用する場合は、結果のサブクラスへの型変換を強制することを忘れないでください。

2.2 ディープ コピーとシャロー コピー

クローン作成について話しているので、ディープ コピーとシャロー コピーについて言及する必要があります。 2 つの概念について簡単に説明します:

A のコンテンツが B にコピーされ、次に B のコンテンツを変更するとします。A のコンテンツが変更されていない場合、それは A です。

説明する必要があるのは、クローン作成メソッドがディープ コピーかシャロー コピーであるか、およびクラス内のメンバー変数とそれ自体が記述したコードが関連していることです。 2 つの異なるクラスが同じクローン作成メソッドを使用しています。1 つはディープ コピーで、もう 1 つはシャロー コピーです。この状況が存在します。

現在、次のようなクラスがあります:

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 メソッドで作成し、別のオブジェクトにクローンして結果を確認します:

Java 抽象クラスとインターフェイスを定義および使用する方法

現時点では、 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 +
                '}';
    }
}
ログイン後にコピー

を変換します。結果は次のとおりです。

Java 抽象クラスとインターフェイスを定義および使用する方法

この時点でクローンを作成します。それは深いコピーですか、それとも浅いコピーですか?

#この結果の理由はメモリに依存します。クラス A が変更される前のメモリは次のとおりです:

Java 抽象クラスとインターフェイスを定義および使用する方法

クラス A の変更されたメモリは次のとおりです。 :

Java 抽象クラスとインターフェイスを定義および使用する方法

上図によると、ディープコピーを実現するには、クラス 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 +
                '}';
    }
}
ログイン後にコピー

Java 抽象クラスとインターフェイスを定義および使用する方法

なぜ自分で絵を描いてみるかについては、ここでは説明しません

3. オブジェクト クラス

一般的なものがいくつかあります。 Object クラスで使用されるメソッドをここで紹介します。

3.1 に等しい

を紹介します。Object クラスでは、このメソッドはサイズを比較するために使用されます。戻り値はブール値です。基になる実装ロジックは次のとおりです。

public boolean equals(Object obj) {
    return (this == obj); 
}
ログイン後にコピー

「 == について、両辺の変数が基本型変数の場合は値が同じかどうか、参照型変数の場合は値が同じかどうかを比較します。

#3.2 toString

出力ステートメントの最下層 System.out.println() は toString メソッドを呼び出しますが、出力が参照型データの場合は比較されません。の場合、デフォルトでは変更されたアドレスが出力されるため、この時点で書き換える必要があります(上記の例も同様です)。

以上がJava 抽象クラスとインターフェイスを定義および使用する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:yisu.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!