Cet article est une suite de "Upcast (Java) qui peut réduire la quantité de changement lorsque la spécification est modifiée". Par conséquent, certains codes sources (classe Cat, classe Dog, classe Life_form) etc. sont répertoriés dans l'élément "Code source" en bas.
Le texte commence par "Qu'est-ce qu'un abattu?"
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) qui peut réduire la quantité de changement lorsque les spécifications sont modifiées» traite de l'upcast, mais l'opération inverse est appelée downcast.
Mais ne le faites pas si facilement.
La conversion ascendante était une conversion de type sûre. Étant donné que la classe enfant hérite de la classe parent, elle possède tous les champs et fonctions de la classe parent. Ainsi, même si vous assignez (upcast) une classe enfant à une instance de la classe parent, il est logique que cela fonctionne correctement.
Mais abattre ne fonctionne pas de cette façon. La classe parente n'a pas ses propres fonctions dans la classe enfant. ** Il serait un peu étrange de déclarer une classe enfant mais de ne pas avoir les fonctions et les champs que la classe enfant devrait avoir. ** **
En fait, quand j'essaye de descendre, le compilateur se met en colère comme ça.
Main.java
public class Main{
public static void main(String[] args){
//Abattu
Cat cat = new Life_form(); //Sous-classe <-Super classe
cat.makeSound();
}
}
Quand j'essaye de downcast (assigner la classe parente Life_form à la classe enfant Cat), le compilateur souligne que les types sont incompatibles.
Alors qu'en est-il de ça (↓)?
Main.java
//Sous-classe <-Super classe
public class Main{
public static void main(String[] args){
Life_form life_form = new Life_form();
Cat cat = new Cat();
//Abattu
cat = (Cat)life_form; //Sous-classe <-Super classe
cat.makeSound();
}
}
Si vous le lancez de force comme le programme ci-dessus, la compilation passera. Mais cette fois, j'obtiens une erreur d'exécution.
Exception in thread "main" java.lang.ClassCastException: Life_form cannot be cast to Cat at Main.main(Main.java:31)
Après tout, il est souligné que le type est incompatible.
Alors que dois-je faire?
En fait, les downcasts ne sont pas utilisés directement comme les upcasts. ** En downcasting, l'entité de l'instance de superclasse doit être une sous-classe **. En d'autres termes, la classe parent ne peut pas être placée dans la classe enfant telle quelle.
Tout ce que vous avez à faire est d'instancier la superclasse dans une sous-classe et de la réduire, comme dans le code ci-dessous.
Main.java
public class Main{
public static void main(String[] args){
//Upcast
Life_form life_form = new Cat(); //Super classe <-sous-classe
//Abattu
Cat cat = (Cat)life_form; //Sous-classe <-Super classe
cat.catPunch();
}
}
Si vous l'écrivez ainsi, vous pouvez l'exécuter correctement. Notez que vous devez ** le lancer correctement (Cat) **.
Le downcast est étroitement lié à l'upcast, alors passons en revue un peu.
Je souhaite utiliser une instance de la classe A comme argument d'une fonction, mais je souhaite également spécifier une instance de la classe B. Upcast a été utilisé dans de telles situations.
Si vous transtypez Cat vers Life_fome, Life_form est en fait une instance de la classe Cat et la classe Cat remplace la fonction makeSound ().
life_form.makeSound();
Le résultat de l'exécution est makeSound () de classe Cat.
Cependant, la fonction catPunch () spécifique à la classe Cat ne peut pas être appelée. ** En effet, même si l'entité est Cat, elle se comporte implicitement comme Life_form **.
Quand j'exécute catPunch () dans l'état upcast, il est signalé comme ceci.
<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 ">
Même si life_form est instancié dans Cat, il est signalé que "symbol not found" car life_form se comporte implicitement comme une classe parente.
#### Alors, comment appelle-t-on catPunch ()?
C'est facile. Vous pouvez le rabaisser.
Si vous regardez le code dans la section "Exemple de réussite" et son résultat d'exécution, vous pouvez confirmer que catPunch () est disponible.
N'oubliez pas que le downcasting est utilisé lorsque vous souhaitez utiliser une fonction unique à chaque instance **.
# Résumé
--Downcast sera utilisé pour les upcast.
- À utiliser lorsque vous souhaitez utiliser une fonction spécifique à une instance de classe enfant upcast.
# Code source
Détails des classes utilisées dans cet article.
#### **`Life_form.java`**
```java
//Classe parent
public class Life_form{
public void makeSound(){
System.out.println("???");
}
}
Cat.java
//Classe enfant
public class Cat extends Life_form{
@Override
public void makeSound(){
System.out.println("nyaa");
}
public void catPunch(){
System.out.println("Pain de chat");
}
}
Dog.java
//Il est utilisé dans la rubrique «Veuillez modifier les spécifications».
public class Dog extends Life_form {
@Override
public void makeSound(){
System.out.println("Kuhn!");
}
public void dogAttack(){
System.out.println("Mordant");
}
}
Recommended Posts