L'opérateur qui est né pour naître, instanceof (Java) ~ Comment utiliser l'opérateur instanceof ~

Remarque

Détails de la classe utilisée

Cet article est la suite de "J'ai écrit sur le downcast d'une manière facile à comprendre". Par conséquent, un certain code source (classe Cat, classe Dog, classe Life_form) etc. est affiché dans l'élément "Détails de la classe utilisée pour l'explication" en bas.

Le texte commence par "Quelle est l'instance de l'opérateur?".

À propos des hausses et des baisses

Cet article passe brièvement en revue les hausses et les baisses, mais plus Si vous souhaitez en savoir plus, veuillez consulter l'article suivant.

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)

Upcast et downcast

Un examen léger avant d'entrer dans l'instance de la description

L'opérateur instanceof est également étroitement lié à la diffusion ascendante et descendante. Par conséquent, passons en revue un peu.

L'upcasting est l'initialisation d'une instance de classe parent avec une instance de classe enfant. Cela signifie que même s'il n'est pas décidé au stade de la conception combien de classes enfants seront créées, il est possible de passer n'importe quelle instance de classe enfant en faisant de l'argument une instance de classe parent **. Est pratique.

Cependant, cela pose des problèmes. Comme expliqué dans "J'ai écrit sur Java downcast d'une manière facile à comprendre" J'ai posté l'autre jour, ** Fonctions propres aux classes enfants lors de l'utilisation de upcast Ne peut pas être appelé **.

Je vais abattre là-bas ... Le sujet principal est d'ici.

Qu'est-ce qu'il y a à l'intérieur?

Jetez un œil au programme ci-dessous et anticipez ce qui va se passer.

Les détails de la classe sont décrits dans "Détails de la classe utilisée pour l'explication".

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

    }

//Appel de fonction propriétaire de downcast.
    Cat lifo = (Cat)life_form;
    lifo.catPunch();

  }
}

Le résultat de l'exécution est le suivant

Résultat d'exécution

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

Expliquons le programme. Il génère un nombre aléatoire et met à jour une instance Cat si elle vaut 0 et une instance Dog si elle vaut 1.

Ensuite, j'essaie de passer à la classe Cat et d'appeler la propre fonction de la classe Cat catPunch ().

Lorsque je l'exécute, il y a deux cas, l'un est lorsque catPunch () est appelé avec succès et l'autre lorsque j'obtiens une erreur ClassCastException.

Vous pouvez voir que cela ne fonctionne correctement que si l'instance générée provient de Cat.

En d'autres termes, à l'inverse, si une instance Dog est créée, une erreur se produit.

Naturellement. Comme vous pouvez le voir dans le bloc de l'instruction if, l'entité de l'instance Life_form peut être une instance Dog. Même si vous essayez de forcer le downcast vers une instance Cat, vous ne pouvez pas devenir une instance Cat même si l'entité est une instance Dog.

** Si vous souhaitez appeler une fonction unique à une classe enfant, vous devez savoir ce qu'est réellement l'instance de classe parent **.

opérateur instanceof

De cette manière, même si l'instance de classe enfant peut être conservée de manière complète par la conversion ascendante, une conversion appropriée ne peut être effectuée que si le contenu est connu, et par conséquent, la fonction unique de la classe enfant ne peut pas être appelée. Cela n'est pas pratique.

** Je veux découvrir la substance de l'instance. Il existe un opérateur instanceof pour y parvenir **.

Instance instance de nom de type

Avec cette syntaxe, vous pouvez découvrir quelle est l'entité de l'instance. True si l'entité d'instance et le nom du type correspondent. Bien sûr, s'ils ne correspondent pas, false est renvoyé comme valeur de retour.

Sur cette base, la version modifiée du programme précédent est présentée ci-dessous.

Succès

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

    }

//Instance instance de nom de type
    if( life_form instanceof Cat ){
      Cat cat = (Cat)life_form;
      cat.catPunch();

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

    }

  }
}

Résultat d'exécution

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

Correctement, ** le comportement par entité est affiché **. Notez que l'opérateur instanceof dans l'expression conditionnelle de l'instruction if permet une conversion descendante appropriée. Assurez-vous également que la fonction propre à l'instance générée peut être appelée correctement.

De cette façon, vous pouvez réaliser une descente sûre en utilisant l'opérateur ** instanceof **.

Résumé

-L'opérateur instanceof``` Instance instance de nom de type


 - L'opérateur instanceof vous permet de modifier le comportement de chaque instance.

 - En utilisant l'opérateur instanceof, vous pouvez obtenir un downcast sécurisé lorsque vous souhaitez utiliser une fonction unique pour une instance de classe enfant upcast.


# Détails tels que la classe utilisée pour la description

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

//Classe parent
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("Pain de chat");
  }

}

Dog.java


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

  public void dogAttack(){
    System.out.println("Mordant");
  }
}

Recommended Posts

L'opérateur qui est né pour naître, instanceof (Java) ~ Comment utiliser l'opérateur instanceof ~
[Java] Comment utiliser la classe File
[Java] Comment utiliser la méthode toString ()
Etudier comment utiliser le constructeur (java)
[Traitement × Java] Comment utiliser la boucle
[Traitement × Java] Comment utiliser la classe
[Java] Comment utiliser la classe Calendar
À propos de la question pour laquelle j'étais accro à l'utilisation de hashmap
Comment utiliser la méthode replace () (Java Silver)
[Java] Comment utiliser Map
Comment utiliser java Facultatif
[Java] Comment utiliser removeAll ()
Comment utiliser Java Map
Comment utiliser la méthode link_to
Comment utiliser HttpClient de Java (Get)
Comment utiliser la méthode include?
Comment utiliser la méthode form_with
Comment utiliser HttpClient de Java (Post)
Comment utiliser la classe wrapper
[Traitement × Java] Comment utiliser les variables
Comment utiliser les méthodes de classe [Java]
[Java] Comment utiliser List [ArrayList]
Comment utiliser les classes en Java?
[Traitement × Java] Comment utiliser les tableaux
Comment utiliser les expressions Java lambda
[Java] Comment utiliser la classe Math
Comment utiliser le type enum Java
Pour utiliser l'outil de ligne de commande "java" ... Comment éviter d'apparaître
Comment utiliser la méthode de soumission (Java Silver)
[Rails] Comment utiliser la méthode de la carte
[Explication facile à comprendre! ] Comment utiliser l'instance Java
[Java] Comment obtenir le répertoire actuel
Comment utiliser et définir les classes Java, importer
[Explication facile à comprendre! ] Comment utiliser le polymorphisme Java
[Java] [Maven3] Résumé de l'utilisation de Maven3
Comment utiliser la classe Java Scanner (Remarque)
Comment obtenir la date avec Java
[Explication facile à comprendre! ] Comment utiliser ArrayList [Java]
[Java] Découvrez comment utiliser correctement Optional
[Explication facile à comprendre! ] Comment utiliser la surcharge Java
gestion des exceptions try-catch-finally Comment utiliser java
[Explication facile à comprendre! ] Comment utiliser l'encapsulation Java
Comment utiliser le module caméra OV7725 (ESP32-WROVER-B)
[Java] Comment utiliser la classe FileReader et la classe BufferedReader
Comment utiliser le framework Java avec AWS Lambda! ??
Sortie de la façon d'utiliser la méthode slice
Comment utiliser l'API Java avec des expressions lambda
[Java] (pour MacOS) Méthode de définition du chemin de classe
[Explication facile à comprendre! ] Comment utiliser l'héritage Java [Explication de remplacement]
[Java] Comment obtenir l'URL redirigée finale
[Java] Mémo sur la façon d'écrire la source