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?"
Atom : 1.28.0 Electron: 2.0.3 Chrome : 61.0.3163.100 Node : 8.9.3
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 (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();
}
}
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 (↓)?
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.
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();
}
}
Wenn Sie es so schreiben, können Sie es richtig ausführen. Beachten Sie, dass Sie es ** richtig wirken müssen (Katze) **.
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