JavaRush /Blog Java /Random-FR /Opérateur d'instance d'en Java

Opérateur d'instance d'en Java

Publié dans le groupe Random-FR
Bonjour! Aujourd'hui, nous allons parler de l'opérateur instanceof, regarder des exemples de son utilisation et aborder quelques points liés à son fonctionnement :) Aux premiers niveaux de JavaRush, vous avez déjà rencontré cet opérateur. Vous souvenez-vous pourquoi c'est nécessaire ? Sinon, ce n’est pas grave, souvenons-nous-en ensemble. L'opérateur instanceof est nécessaire pour vérifier si l'objet référencé par la variable X a été créé à partir d'une classe Y. Cela semble simple. Pourquoi sommes-nous revenus sur ce sujet ? Tout d’abord, parce que vous connaissez désormais bien le mécanisme d’héritage en Java et les autres principes de la POO. Le sujet de instanceof sera beaucoup plus clair et nous examinerons des cas d'utilisation plus avancés. Aller! Comment fonctionne l'opérateur Instanceof - 1Vous vous souvenez probablement que l'opérateur instanceof renvoie true si le test était vrai, ou false si le résultat était faux. Par conséquent, on le retrouve le plus souvent dans divers types de conditions d’essai ( if…else). Commençons par des exemples plus simples :
public class Main {

   public static void main(String[] args) {

       Integer x = new Integer(22);

       System.out.println(x instanceof Integer);
   }
}
Selon vous, qu'est-ce qui sera envoyé à la console ? Eh bien, c'est évident ici :) L'objet хest un Integer, donc le résultat sera true . Sortie de la console : true Essayons de vérifier s'il appartient, par exemple, à String :
public class Main {

   public static void main(String[] args) {

       Integer x = new Integer(22);

       System.out.println(x instanceof String);// error!
   }
}
Nous avons reçu une erreur. Et faites attention : le compilateur l'a émis avant même que le code ne soit exécuté ! Il a immédiatement vu qu'Integer et String ne peuvent pas être automatiquement convertis l'un en l'autre et n'ont pas de relations d'héritage. Par conséquent, un objet de classe Integer ne sera pas créé à partir de la chaîne. C'est pratique et permet d'éviter des erreurs étranges déjà lors de l'exécution du programme, c'est pourquoi le compilateur nous a aidé ici :) Essayons maintenant d'examiner des exemples plus complexes. Puisque nous avons mentionné l'héritage, travaillons avec ce petit système de classes :
public class Animal {

}

public class Cat extends Animal {

}

public class MaineCoon extends Cat {

}
Nous savons déjà comment se comporte instanceof lorsque nous vérifions si un objet appartient à une classe dans une situation normale, mais que se passe-t-il si nous ajoutons ici une relation parent-enfant ? Comment fonctionne l'opérateur Instanceof - 2 Par exemple, que pensez-vous que la vérification suivante produira :
public class Main {

   public static void main(String[] args) {

       Cat cat = new Cat();

       System.out.println(cat instanceof Animal);

       System.out.println(cat instanceof MaineCoon);

   }
}
Résultat : true false La principale question à laquelle il faut répondre est de savoir comment exactement instanceof déchiffre le concept « d'un objet créé sur la base d'une classe » ? En conséquence, nous l'avons obtenu Сat instanceof Animal == true, mais on peut critiquer une telle formulation. Pourquoi cet objet est- Catil créé en fonction de la classe Animal? N'est-il pas uniquement créé sur la base de sa propre classe ? La réponse est assez simple et vous l’avez peut-être déjà trouvée. N'oubliez pas l'ordre dans lequel les constructeurs sont appelés et les variables sont initialisées lors de la création d'un objet. Nous avons déjà abordé ce sujet dans l'article sur le constructeur de classe . Voici un exemple de cette conférence :
public class Animal {

   String brain = "The initial value of brain in the Animal class";
   String heart = "The initial value of heart in the Animal class";

   public static int animalCount = 7700000;

   public Animal(String brain, String heart) {
       System.out.println("The constructor of the Animal base class is being executed");
       System.out.println("Have the variables of the Animal class already been initialized?");
       System.out.println("The current value of the static variable animalCount = " + animalCount);
       System.out.println("Current value of brain in class Animal = " + this.brain);
       System.out.println("Current value of heart in class Animal = " + this.heart);

       this.brain = brain;
       this.heart = heart;
       System.out.println("Animal base class constructor completed!");
       System.out.println("Current value of brain = " + this.brain);
       System.out.println("Current value of heart = " + this.heart);
   }
}

class Cat extends Animal {

   String tail = "The initial value of tail in the Cat class";

   static int catsCount = 37;

   public Cat(String brain, String heart, String tail) {
       super(brain, heart);
       System.out.println("The constructor of the Cat class has started (the Animal constructor has already been executed)");
       System.out.println("The current value of the static variable catsCount = " + catsCount);
       System.out.println("Current value tail = " + this.tail);
       this.tail = tail;
       System.out.println("Current value tail = " + this.tail);
   }

   public static void main(String[] args) {
       Cat cat = new Cat("Brain", "Heart", "Tail");
   }
}
Et si vous l'exécutez dans l'EDI, la sortie de la console ressemblera à ceci :  Le constructeur de la classe de base Animal est en cours d'exécution. Les variables de la classe Animal ont-elles déjà été initialisées ? Valeur actuelle de la variable statique animalCount = 7700000 Valeur actuelle du cerveau dans la classe Animal = Valeur initiale du cerveau dans la classe Animal Valeur actuelle du cœur dans la classe Animal = Valeur initiale du cœur dans la classe Animal Le constructeur de la classe Animal de base a terminé son travail ! Valeur actuelle de brain = Brain Valeur actuelle de heart = Heart Le constructeur de la classe Cat a commencé à fonctionner (le constructeur Animal a déjà été exécuté) Valeur actuelle de la variable statique catsCount = 37 Valeur actuelle de tail = Valeur initiale de tail dans le Classe de chat Valeur actuelle de tail = Tail Vous vous souvenez maintenant ? :) Le constructeur de la classe de base, s'il existe, est toujours appelé en premier lors de la création d'un objet. Instanceof suit ce principe lorsqu'il tente de déterminer si un objet a été Аcréé à partir d'une classe Б. Si le constructeur de la classe de base est appelé, il n’y a aucun doute. Avec la deuxième vérification, tout est plus simple :
System.out.println(cat instanceof MaineCoon);
Le constructeur MaineCoonn'a pas été appelé lors de la création Cat, ce qui est logique. Après tout, MaineCoonil est un descendant Catet non un ancêtre. Mais Catce n'est pas un modèle pour. Ok, cela semble clair. Que se passera-t-il si nous faisons ceci :
public class Main {

   public static void main(String[] args) {

       Cat cat = new MaineCoon();

       System.out.println(cat instanceof Cat);
       System.out.println(cat instanceof MaineCoon);


   }
}
Hmm... c'est plus compliqué. Essayons de raisonner. Nous avons une variable de type Catet nous lui avons attribué un objet de type MaineCoon. Au fait, pourquoi est-ce que ça marche ? Est-il possible de faire cela? Peut. Après tout, tout Maine Coon est un chat. Si ce n'est pas tout à fait clair, souvenez-vous de l'exemple avec les extensions de type primitif :
public class Main {

   public static void main(String[] args) {

       long x = 1024;

   }
}
Le nombre 1024 est court : il s'intègre facilement dans la variable longue , car le nombre d'octets lui suffit (vous vous souvenez de l'exemple avec les poupées gigognes ?). Un objet enfant peut toujours être affecté à une variable ancêtre. N'oubliez pas cela pour l'instant, et dans les prochaines conférences, nous analyserons ce processus plus en détail. Alors, que produira notre exemple ?
Cat cat = new MaineCoon();
System.out.println(cat instanceof Cat);
System.out.println(cat instanceof MaineCoon);
Que va vérifier instanceof : notre variable de classe Catou notre objet de classeMaineCoon ? En fait, la réponse à cette question est simple. Il vous suffit de relire la définition de notre opérateur : L'opérateur instanceof est nécessaire pour vérifier si l'objet référencé par la variable a été Xcréé sur la base d'une classe Y. L'opérateur instanceof vérifie l'origine d'un objet, pas d'une variable. Par conséquent, dans l'exemple, les deux fois, il affichera true dans la console : nous avons un objet de type MaineCoon. Naturellement, il a été créé en fonction de la classe MaineCoon, mais aussi en fonction de la classe parentCat !
Commentaires
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION