Heim  >  Artikel  >  Java  >  So definieren und verwenden Sie abstrakte Java-Klassen und -Schnittstellen

So definieren und verwenden Sie abstrakte Java-Klassen und -Schnittstellen

WBOY
WBOYnach vorne
2023-05-05 19:43:051434Durchsuche

1. Vergleich von Objekten

Bevor wir zwei Objekte vergleichen, müssen wir zunächst bestimmen, worauf wir vergleichen möchten. Das Objekt enthält so viele Mitgliedsvariablen, dass ein direkter Vergleich unmöglich ist.

1.2 Komparator

In dieser Schnittstelle gibt es eine abstrakte Methode vergleichen, die auch zum Vergleichen von Größen zwischen Objekten verwendet wird. Die Struktur der Methode ist wie folgt:

So definieren und verwenden Sie abstrakte Java-Klassen und -Schnittstellen

und Comparable-Schnittstelle kann als Parameter der Sortiermethode in der Arrays-Klasse verwendet werden

So definieren und verwenden Sie abstrakte Java-Klassen und -Schnittstellen

Wenn es sich um ein Array handelt, dessen Elemente Klassen sind, kann die Comparator-Schnittstelle verwendet werden, um das Array weiter zu sortieren 2. Objekt klonen automatisch in IDEA umgeschrieben Die ()-Methode lautet wie folgt:

So definieren und verwenden Sie abstrakte Java-Klassen und -Schnittstellen

throws und die folgenden Anweisungen stehen jetzt nicht im Mittelpunkt, daher werden wir sie vorerst überspringen

So definieren und verwenden Sie abstrakte Java-Klassen und -SchnittstellenDenken Sie daran, dass der Rückgabewert dieser Methode die Object-Klasse ist um das Ergebnis bei der Verwendung in eine Unterklasse umzuwandeln

2.2 Deep Copy und Shallow Copy

Da wir über Klonen sprechen, müssen wir kurz über die Konzepte der beiden sprechen:

Angenommen Der Inhalt von A wird nach B kopiert, und dann ändern wir den Inhalt von B. Inhalt. Wenn sich der Inhalt von A nicht geändert hat, handelt es sich um eine tiefe Kopie, andernfalls um eine flache Kopie

Es muss erklärt werden: ob Eine Klonmethode ist eine tiefe Kopie oder eine flache Kopie, die etwas mit den Mitgliedsvariablen in der Klasse und dem von Ihnen geschriebenen Code zu tun hat. Beide Klassen verwenden dieselbe Klonmethode, eine ist eine tiefe Kopie und die andere ist eine flache Kopie. Diese Situation existiert

Jetzt gibt es eine Klasse wie folgt:

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 +
                '}';
    }
}

Wir instanziieren sie in der Hauptmethode und klonen sie in ein anderes Objekt. Schauen Sie sich das Ergebnis an: So definieren und verwenden Sie abstrakte Java-Klassen und -Schnittstellen

Zu diesem Zeitpunkt hat sich a aufgrund von nicht geändert Die Änderung von b. clone() ist eine tiefe Kopie. Wir transformieren dann Klasse 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 +
                '}';
    }
}
. Das Ergebnis ist wie folgt:

Ist der Klon zu diesem Zeitpunkt also eine tiefe oder eine flache Kopie?

Der Grund für dieses Ergebnis hängt vom Speicher ab. Vor der Änderung der Klasse A ist der Speicher wie folgt:

Der geänderte Speicher der Klasse A ist wie folgt:

So definieren und verwenden Sie abstrakte Java-Klassen und -Schnittstellen

Gemäß dem obigen Bild: Um Deep Copying zu erreichen, ist ein weiterer Klon des Inhalts der Klasse B erforderlich. Daher müssen wir die Klonmethode ändern .Objektklasse

Objektklasse Hier werden einige häufig verwendete Methoden vorgestellt

3.1 gleich

So definieren und verwenden Sie abstrakte Java-Klassen und -SchnittstellenIn der Objektklasse wird diese Methode zum Vergleichen von Größen verwendet. Die zugrunde liegende Implementierungslogik ist wie folgt :

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 +
                '}';
    }
}

Über "==": Wenn die Variablen auf beiden Seiten Basistypvariablen sind, wird verglichen, ob die Werte gleich sind, und wenn es sich um Referenztypvariablen handelt, wird verglichen, ob die Adressen gleich sind

3.2 toString

Ausgabeanweisung Der zugrunde liegende Aufruf von System.out.println() ist die toString-Methode. Wenn es sich bei der Ausgabe jedoch um Referenztypdaten handelt, wird standardmäßig die geänderte Adresse ausgegeben, sodass sie zu diesem Zeitpunkt neu geschrieben werden muss. Aus diesem Grund gibt es im obigen Beispiel eine toString-MethodeSo definieren und verwenden Sie abstrakte Java-Klassen und -Schnittstellen

Das obige ist der detaillierte Inhalt vonSo definieren und verwenden Sie abstrakte Java-Klassen und -Schnittstellen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:yisu.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen