Der Operator, der geboren wurde, um geboren zu werden, instanceof (Java) ~ So verwenden Sie den instanceof-Operator ~

Hinweis

Details der verwendeten Klasse

Dieser Artikel ist eine Fortsetzung von "Ich habe auf leicht verständliche Weise über den Niedergeschlagenen geschrieben". Daher wird ein Teil des Quellcodes (Cat-Klasse, Dog-Klasse, Life_form-Klasse) usw. im Element "Details der zur Erklärung verwendeten Klasse" unten veröffentlicht.

Der Text beginnt mit "Was ist die Instanz des Operators?".

Über Upcast und Downcast

Dieser Artikel gibt einen kurzen Überblick über Upcasts und Downcasts, aber mehr Wenn Sie mehr wissen möchten, lesen Sie bitte den folgenden Artikel.

Entwicklungsumgebung

Texteditor verwendet Atom (im Folgenden Atom-Konvertierungs-Ausführungsergebnis)

Atom : 1.28.0 Electron: 2.0.3 Chrome : 61.0.3163.100 Node : 8.9.3

~ Unten das Ausführungsergebnis des Befehls "java -version" ~

java version "1.8.0_161" Java(TM) SE Runtime Environment (build 1.8.0_161-b12) Java HotSpot(TM) 64-Bit Server VM (build 25.161-b12, mixed mode)

Upcast und Downcast

Eine leichte Überprüfung, bevor auf die Instanz der Beschreibung eingegangen wird

Die Instanz des Operators ist auch eng mit Upcast und Downcast verbunden. Lassen Sie uns daher einen kleinen Rückblick geben.

Upcasting ist die Initialisierung einer übergeordneten Klasseninstanz mit einer untergeordneten Klasseninstanz. Dies ist ** auch wenn in der Entwurfsphase nicht entschieden wird, wie viele untergeordnete Klassen erstellt werden sollen. Wenn Sie das Argument zu einer übergeordneten Klasseninstanz machen, können Sie jede untergeordnete Klasseninstanz übergeben ** Ist bequem.

Es gibt jedoch Probleme damit. Wie in "Ich habe auf leicht verständliche Weise über Java-Downcast geschrieben erklärt" habe ich neulich geschrieben: ** Funktionen, die nur für untergeordnete Klassen gelten, wenn Upcast verwendet wird Kann nicht ** genannt werden.

Ich werde dort niedergeschlagen ... Das Hauptthema ist von hier.

Was ist da drin?

Schauen Sie sich das Programm unten an und antizipieren Sie, was passieren wird.

Die Details der Klasse werden unter "Details der zur Erklärung verwendeten Klasse" beschrieben.

Main.java


public class Main{
  public static void main(String[] args){
    Life_form life_form = new Life_form();

    java.util.Random r = new java.util.Random();
    if( r.nextInt(2) == 0 ){
      life_form = new Cat();

    }else{
      life_form = new Dog();

    }

//Proprietärer Funktionsaufruf von Downcast.
    Cat lifo = (Cat)life_form;
    lifo.catPunch();

  }
}

Das Ausführungsergebnis ist wie folgt

Ausführungsergebnis

スクリーンショット 2018-07-04 16.47.59.png

Lassen Sie uns das Programm erklären. Es generiert eine Zufallszahl und sendet eine Cat-Instanz, wenn sie 0 ist, und eine Dog-Instanz, wenn sie 1 ist.

Dann versuche ich, auf die Cat-Klasse herunterzuspielen und die eigene Funktion catPunch () der Cat-Klasse aufzurufen.

Wenn ich es ausführe, gibt es zwei Fälle, einen, wenn catPunch () erfolgreich aufgerufen wird, und den anderen, wenn ich einen ClassCastException-Fehler erhalte.

Sie können sehen, dass es nur funktioniert, wenn die generierte Instanz von Cat stammt.

Mit anderen Worten, wenn umgekehrt eine Dog-Instanz erstellt wird, tritt ein Fehler auf.

Natürlich. Wie Sie dem Block der if-Anweisung entnehmen können, kann die Entität der Life_form-Instanz eine Dog-Instanz sein. Selbst wenn Sie versuchen, eine Cat-Instanz gewaltsam herunterzuspielen, können Sie keine Cat-Instanz werden, obwohl die Entität eine Dog-Instanz ist.

** Wenn Sie eine für eine untergeordnete Klasse eindeutige Funktion aufrufen möchten, müssen Sie wissen, was die übergeordnete Klasseninstanz wirklich ist **.

Instanz des Operators

Auf diese Weise kann, selbst wenn die Instanzen der untergeordneten Klasse durch Upcasting umfassend beibehalten werden können, kein ordnungsgemäßes Casting durchgeführt werden, ohne den Inhalt zu kennen, und daher können die für die untergeordnete Klasse eindeutigen Funktionen nicht aufgerufen werden. Dies ist unpraktisch.

** Ich möchte den Inhalt der Instanz herausfinden. Es gibt eine Instanz des Operators, um dies zu erreichen **.

Instanz Instanz des Typnamens

Mit dieser Syntax können Sie herausfinden, was die Entität der Instanz ist. True, wenn die Instanzentität und der Typname übereinstimmen. Wenn sie nicht übereinstimmen, wird natürlich false als Rückgabewert zurückgegeben.

Auf dieser Grundlage wird die geänderte Version des vorherigen Programms unten gezeigt.

Erfolgsgeschichte

Main.java


public class Main{
  public static void main(String[] args){
    Life_form life_form = new Life_form();

    java.util.Random r = new java.util.Random();
    if( r.nextInt(2) == 0 ){
      life_form = new Cat();

    }else{
      life_form = new Dog();

    }

//Instanz Instanz des Typnamens
    if( life_form instanceof Cat ){
      Cat cat = (Cat)life_form;
      cat.catPunch();

    }else{
      Dog dog = (Dog)life_form;
      dog.dogAttack();

    }

  }
}

Ausführungsergebnis

スクリーンショット 2018-07-04 17.26.13.png

Richtig, ** Verhalten nach Entität wird ausgegeben **. Beachten Sie, dass der Operator instanceof im bedingten Ausdruck der if-Anweisung ein ordnungsgemäßes Downcasting ermöglicht. Stellen Sie außerdem sicher, dass die für die generierte Instanz eindeutige Funktion ordnungsgemäß aufgerufen werden kann.

Auf diese Weise können Sie mit dem Operator ** instanceof ** einen sicheren Downcast erzielen.

Zusammenfassung

-Die Instanz des Operators``` Instanz Instanz des Typnamens


 - Mit dem Operator instanceof können Sie das Verhalten jeder Instanz ändern.

 - Mit dem Operator instanceof können Sie einen sicheren Downcast erzielen, wenn Sie eine Funktion verwenden möchten, die nur für eine untergeordnete Upcast-Klasseninstanz gilt.


# Details wie die für die Beschreibung verwendete Klasse

#### **`Life_form.java`**
```java

//Übergeordnete Klasse
public class Life_form{
  public void makeSound(){
    System.out.println("???");
  }
}

Cat.java


public class Cat extends Life_form{
  @Override
  public void makeSound(){
    System.out.println("nyaa");
  }

  public void catPunch(){
    System.out.println("Katzenbrot");
  }

}

Dog.java


public class Dog extends Life_form {
  @Override
  public void makeSound(){
    System.out.println("Kuhn!");
  }

  public void dogAttack(){
    System.out.println("Beißen");
  }
}

Recommended Posts

Der Operator, der geboren wurde, um geboren zu werden, instanceof (Java) ~ So verwenden Sie den instanceof-Operator ~
[Java] Verwendung der File-Klasse
[Java] Verwendung der toString () -Methode
Studieren der Verwendung des Konstruktors (Java)
[Verarbeitung × Java] Verwendung der Schleife
[Verarbeitung × Java] Verwendung der Klasse
[Java] Verwendung der Calendar-Klasse
Über die Sache, dass ich süchtig danach war, wie man Hashmap benutzt
Verwendung der replace () -Methode (Java Silver)
[Java] Verwendung von Map
Verwendung von Java Optional
[Java] Verwendung von removeAll ()
Verwendung von Java Map
Verwendung der link_to-Methode
Verwendung von HttpClient (Get) von Java
Verwendung der include? -Methode
Verwendung der Methode form_with
Verwendung von HttpClient (Post) von Java
Verwendung der Wrapper-Klasse
[Verarbeitung × Java] Verwendung von Variablen
Verwendung von Klassenmethoden [Java]
[Java] Verwendung von List [ArrayList]
Wie verwende ich Klassen in Java?
[Verarbeitung × Java] Verwendung von Arrays
Verwendung von Java-Lambda-Ausdrücken
[Java] Verwendung der Math-Klasse
Verwendung des Java-Aufzählungstyps
So verwenden Sie das Befehlszeilentool "Java" ... So vermeiden Sie das Auftauchen
Verwendung der Submit-Methode (Java Silver)
[Schienen] Verwendung der Kartenmethode
[Leicht verständliche Erklärung! ] Verwendung der Java-Instanz
[Java] So erhalten Sie das aktuelle Verzeichnis
Verwendung und Definition von Java-Klassen, Importieren
[Leicht verständliche Erklärung! ] Verwendung des Java-Polymorphismus
[Java] [Maven3] Zusammenfassung der Verwendung von Maven3
Verwendung der Java Scanner-Klasse (Hinweis)
So erhalten Sie das Datum mit Java
[Leicht verständliche Erklärung! ] Verwendung von ArrayList [Java]
[Java] Erfahren Sie, wie Sie Optional richtig verwenden
[Leicht verständliche Erklärung! ] Verwendung von Java-Überladung
try-catch-finally Ausnahmebehandlung Verwendung von Java
[Leicht verständliche Erklärung! ] Verwendung der Java-Kapselung
Verwendung des Kameramoduls OV7725 (ESP32-WROVER-B)
[Java] Verwendung der FileReader-Klasse und der BufferedReader-Klasse
Verwendung des Java-Frameworks mit AWS Lambda! ??
Ausgabe der Verwendung der Slice-Methode
Verwendung der Java-API mit Lambda-Ausdrücken
[Java] (für MacOS) Methode zur Einstellung des Klassenpfads
[Leicht verständliche Erklärung! ] Verwendung der Java-Vererbung [Erklärung überschreiben]
[Java] So erhalten Sie die endgültige umgeleitete URL
[Java] Memo zum Schreiben der Quelle