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?".
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.
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)
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.
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
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 **.
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.
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();
}
}
}
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 **.
-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