Ich habe leicht verständlich über Java Downcast geschrieben

Voraussetzungen

Dieser Artikel ist eine Fortsetzung von "Upcast (Java), das den Änderungsbetrag reduzieren kann, wenn die Spezifikation geändert wird". Daher sind einige Quellcodes (Cat-Klasse, Dog-Klasse, Life_form-Klasse) usw. im Element "Quellcode" unten aufgeführt.

Der Text beginnt mit "Was ist ein Niedergeschlagener?"

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)

Was ist niedergeschlagen

"Upcast (Java), das den Änderungsbetrag reduzieren kann, wenn die Spezifikationen geändert werden" befasste sich mit Upcast, aber die entgegengesetzte Operation wird als Downcast bezeichnet.

Aber setzen Sie es nicht so einfach zusammen.

Der Upcast war eine sichere Typkonvertierung.

Main.java


public class Main{
  public static void main(String[] args){

    //
    Cat cat = new Life_form();       //Aber Downcasting funktioniert nicht so. Die übergeordnete Klasse hat keine eigenen Funktionen in der untergeordneten Klasse. ** Es wäre etwas seltsam, eine untergeordnete Klasse zu deklarieren, aber nicht die Funktionen und Felder zu haben, die die untergeordnete Klasse haben sollte. ** Wenn ich versuche, einen Downcast durchzuführen, wird der Compiler tatsächlich so wütend. Fehlerbeispiel 1 Downcast-Unterklasse <-Superklasse
    cat.makeSound();
  }
}

Ausführungsergebnis

スクリーンショット 2018-07-02 16.50.08.png

Wenn ich versuche, einen Downcast durchzuführen (die untergeordnete Klasse Life_form der untergeordneten Klasse Cat zuzuweisen), weist der Compiler darauf hin, dass die Typen nicht kompatibel sind.

Wie wäre es dann damit (↓)?

Fehlerbeispiel 2

Main.java


//Unterklasse <-Superklasse
public class Main{
  public static void main(String[] args){
    Life_form life_form = new Life_form();
    Cat cat = new Cat();

    //Niedergeschlagen
    cat = (Cat)life_form;       //Unterklasse <-Superklasse
    cat.makeSound();
  }
}

Wenn Sie es wie im obigen Programm gewaltsam umsetzen, wird die Kompilierung bestanden. Aber diesmal bekomme ich einen Laufzeitfehler.

Exception in thread "main" java.lang.ClassCastException: Life_form cannot be cast to Cat at Main.main(Main.java:31)

Immerhin wird darauf hingewiesen, dass der Typ nicht kompatibel ist.

Was soll ich dann tun?

In der Tat werden Downcasts nicht direkt wie Upcasts verwendet. ** Beim Downcasting muss die Entität der Oberklasseninstanz eine Unterklasse sein **. Mit anderen Worten, die übergeordnete Klasse kann nicht so wie sie ist in die untergeordnete Klasse eingeordnet werden.

Alles, was Sie tun müssen, ist, die Oberklasse in einer Unterklasse zu instanziieren und sie wie im folgenden Code herunterzuspielen.

Erfolgsgeschichte

Main.java


public class Main{
  public static void main(String[] args){

    //Upcast
    Life_form life_form = new Cat();      //Superklasse <Unterklasse

    //Niedergeschlagen
    Cat cat = (Cat)life_form;        //Unterklasse <-Superklasse
    cat.catPunch();
  }
}

Ausführungsergebnis

スクリーンショット 2018-07-02 17.20.16.png

Wenn Sie es so schreiben, können Sie es richtig ausführen. Beachten Sie, dass Sie es ** richtig wirken müssen (Katze) **.

Wann benutzt du Downcast?

Sie können catPunch () nicht mit dem Upcast aufrufen

Der Downcast ist eng mit dem Upcast verwandt, also lasst es uns ein wenig überprüfen.

Ich möchte eine Klasse-A-Instanz als Funktionsargument verwenden, aber ich möchte auch eine Klasse-B-Instanz angeben. Upcast wurde in solchen Situationen verwendet.

Wenn Sie Cat auf Life_fome hochstufen, ist Life_form tatsächlich eine Instanz der Cat-Klasse, und die Cat-Klasse überschreibt die Funktion makeSound ().

life_form.makeSound();


 Das Ergebnis der Ausführung ist makeSound () der Cat-Klasse.

 Die klassenspezifische Cat-Funktion catPunch () kann jedoch nicht aufgerufen werden. ** Dies liegt daran, dass sich die Entität, selbst wenn sie Cat ist, implizit als Lebensform verhält **.

 Wenn ich catPunch () im Upcast-Status ausführe, wird darauf hingewiesen.
 <img width="327" alt="スクリーンショット 2018-07-02 18.08.36.png " src="https://qiita-image-store.s3.amazonaws.com/0/219573/f3849dd4-54b7-fd94-b1d1-83d70296533c.png ">

 Obwohl life_form in Cat instanziiert wird, wird darauf hingewiesen, dass "Symbol nicht gefunden" wird, da sich life_form implizit als übergeordnete Klasse verhält.


#### Wie nennt man catPunch ()?
 Es ist einfach. Sie können es niederschlagen.
 Wenn Sie sich den Code im Abschnitt "Erfolgsbeispiel" und dessen Ausführungsergebnis ansehen, können Sie bestätigen, dass catPunch () verfügbar ist.

 Denken Sie daran, dass Downcasting verwendet wird, wenn Sie eine Funktion verwenden möchten, die für jede Instanz eindeutig ist **.



# Zusammenfassung
 --Downcast wird für Upcast verwendet.
 - Verwenden Sie diese Option, wenn Sie eine instanzspezifische Funktion einer untergeordneten untergeordneten Klasse verwenden möchten.


# Quellcode
 Details zu den in diesem Artikel verwendeten Klassen.


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

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

Cat.java


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

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

}

Dog.java


//Es wird im Artikel "Bitte ändern Sie die Spezifikationen" verwendet.
public class Dog extends Life_form {
  @Override
  public void makeSound(){
    System.out.println("Kuhn!");
  }

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

Recommended Posts

Ich habe leicht verständlich über Java Downcast geschrieben
Ich habe Gordobachs Theorem in Java geschrieben
Ich habe eine Anmerkung in Java gemacht.
Ich habe ein Programm zur Beurteilung von Primzahlen in Java geschrieben
Ich habe ein Primfaktorisierungsprogramm in Java geschrieben
Ich habe versucht, die erweiterte for-Anweisung in Java zu verwenden
Was ich über Java 8 recherchiert habe
Über Java-Instanzen
Was ich über Java 6 recherchiert habe
Ich habe ein Roulette in Java gemacht.
Was ich über Java 9 recherchiert habe
Was ich über Java 7 recherchiert habe
Über Java Abstract Class
Ich habe versucht, Metaprogrammierung mit Java
Was ich über Java 5 recherchiert habe
Ich habe einen Interpreter (Compiler?) Mit ungefähr 80 Zeilen in Ruby erstellt.
Ich habe ein PDF mit Java erstellt.
Ich habe eine Sterling-Sorte geschrieben, die sich wie in Java anfühlt
Versuchen Sie einen If-Ausdruck in Java
Ich habe versucht, JWT in Java zu verwenden
Informationen zur Dateikopierverarbeitung in Java
Was ich über Java-Lernen recherchiert habe
Führen Sie einen externen Prozess in Java aus
Ich habe EX25 des AtCoder Programming Guide für Anfänger (APG4b) in Java geschrieben.
Ich habe eine Lambda-Funktion in Java geschrieben und mit SAM bereitgestellt
Ich möchte für jedes Array mit Lambda-Ausdruck in Java
Informationen zum Zurückgeben einer Referenz in einem Java Getter
Ich habe versucht, die Elasticsearch-API in Java zu verwenden
Map ohne Verwendung eines Arrays in Java
[Erstellen] Ein Memorandum über das Codieren in Java
Ich habe das neue Yuan-Problem in Java ausprobiert
Informationen zu Datensätzen, die zur Vorschau in Java JDK 14 hinzugefügt wurden
Fortsetzung Sprechen Sie über das Schreiben von Java mit Emacs @ 2018
Ich habe die OpenCV-Kamerakalibrierung in Java durchgeführt
[* Java *] Ich habe am JJUG CCC 2019 Spring teilgenommen
Ich habe ein Programm zur Beurteilung von Primzahlen in Java erstellt
Über die Verwirrung beim Starten von Java-Servern
Über die Idee anonymer Klassen in Java
Eine Geschichte über das JDK in der Java 11-Ära
Versuchen Sie, etwa 30 Zeilen in Java zu kratzen (CSV-Ausgabe)
Informationen zu in Java verwendeten Variablen (lokaler Variablentyp)
Zweite Abkochung: Versuchen Sie einen If-Ausdruck in Java
Ich wollte (a == 1 && a == 2 && a == 3) in Java wahr machen
Ich habe ein Janken-Spiel in Java (CLI) gemacht.
rsync4j - Ich möchte rsync in Java berühren.
Was ich in Java gelernt habe (Teil 2) Was sind Variablen?
Ich habe versucht, neunundneunzig in Java auszugeben
So lösen Sie Ausdrucksprobleme in Java
Ich habe versucht, eine Anwendung in 2 Sprachen zu entwickeln
Ich habe versucht, Alexa-Fähigkeiten mit Java zu erstellen
[AWS? Docker?] Fassen Sie die erforderlichen Kenntnisse in Ihrem Portfolio auf leicht verständliche Weise zusammen. [Terraform? CircleCI?]
Ich möchte ein Objekt im CSV-Format mit mehrzeiligem Header und Filter in Java zurückgeben