ホームページ  >  記事  >  Java  >  Java 抽象クラスとインターフェイスを定義および使用する方法

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

WBOY
WBOY転載
2023-05-05 19:43:051509ブラウズ

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 までご連絡ください。