J'ai écrit sur Java downcast d'une manière facile à comprendre

Conditions préalables

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?"

Environnement de développement

L'éditeur de texte a utilisé Atom (ci-après résultat de l'exécution atom -vertion)

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

~ Ci-dessous, le résultat de l'exécution de la commande "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)

Qu'est-ce qui est abattu

«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.

Exemple de défaillance 1

Main.java


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

    //Abattu
    Cat cat = new Life_form();       //Sous-classe <-Super classe
    cat.makeSound();
  }
}

Résultat d'exécution

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

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 (↓)?

Exemple d'échec 2

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.

Succès

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();
  }
}

Résultat d'exécution

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

Si vous l'écrivez ainsi, vous pouvez l'exécuter correctement. Notez que vous devez ** le lancer correctement (Cat) **.

Quand utilisez-vous downcast?

Vous ne pouvez pas appeler catPunch () avec l'upcast

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

J'ai écrit sur Java downcast d'une manière facile à comprendre
J'ai écrit le théorème de Gordobach en java
J'ai fait une annotation en Java.
J'ai écrit un programme de jugement des nombres premiers en Java
J'ai écrit un programme de factorisation prime en Java
J'ai essayé d'utiliser l'instruction Extended for en Java
Ce que j'ai recherché sur Java 8
À propos des instances Java
Ce que j'ai recherché sur Java 6
J'ai fait une roulette à Java.
Ce que j'ai recherché sur Java 9
Ce que j'ai recherché sur Java 7
À propos de la classe abstraite Java
J'ai essayé la métaprogrammation avec Java
Ce que j'ai recherché sur Java 5
J'ai fait un interpréteur (compilateur?) Avec environ 80 lignes en Ruby.
J'ai créé un PDF avec Java.
J'ai écrit une sorte de livre qui ressemble à Java
Essayez une expression If en Java
J'ai essayé d'utiliser JWT en Java
A propos du traitement de la copie de fichiers en Java
Ce que j'ai recherché sur l'apprentissage Java
Exécuter un processus externe en Java
J'ai écrit EX25 du guide de programmation AtCoder pour les débutants (APG4b) en java.
J'ai écrit une fonction Lambda en Java et l'ai déployée avec SAM
Je veux ForEach un tableau avec une expression Lambda en Java
A propos du renvoi d'une référence dans un Java Getter
J'ai essayé d'utiliser l'API Elasticsearch en Java
Mapper sans utiliser de tableau en java
[Création] Un mémorandum sur le codage en Java
J'ai essayé le nouveau yuan à Java
À propos des enregistrements ajoutés pour l'aperçu dans Java JDK 14
Discussion continue sur l'écriture de Java avec Emacs @ 2018
J'ai fait l'étalonnage de la caméra OpenCV en Java
[* Java *] J'ai participé au JJUG CCC 2019 Spring
J'ai créé un programme de jugement des nombres premiers en Java
À propos de la confusion observée dans les serveurs Java de démarrage
À propos de l'idée des classes anonymes en Java
Une histoire sur le JDK à l'ère de Java 11
Essayez de gratter environ 30 lignes en Java (sortie CSV)
À propos de var utilisé en Java (type de variable locale)
Deuxième décoction: essayez une expression If en Java
Je voulais que (a == 1 && a == 2 && a == 3) vrai en Java
J'ai créé un jeu Janken en Java (CLI)
rsync4j --Je veux toucher rsync en Java.
Ce que j'ai appris en Java (partie 2) Que sont les variables?
J'ai essayé de sortir quatre-vingt-dix-neuf en Java
Comment résoudre les problèmes d'expression en Java
J'ai essayé de développer une application en 2 langues
J'ai essayé de créer une compétence Alexa avec Java
[AWS? Docker?] Résumez les connaissances nécessaires dans votre portefeuille de manière simple à comprendre [terraform? CircleCI?]
Je souhaite renvoyer un objet au format CSV avec en-tête et filtre multilignes en Java