CodeGym /Blog Java /Aleatoriu /Instanță Java a operatorului
John Squirrels
Nivel
San Francisco

Instanță Java a operatorului

Publicat în grup
Bună! Astăzi vom vorbi despre operatorul instanceof , vom lua în considerare exemple despre cum este utilizat și vom aborda câteva aspecte ale modului în care funcționează:) Ați întâlnit deja acest operator la primele niveluri ale CodeGym. Îți amintești de ce avem nevoie? Dacă nu, nu vă faceți griji. Să ne amintim împreună. Operatorul instanceof este necesar pentru a verifica dacă un obiect referit de o variabilă X a fost creat pe baza unei clase Y. Sună simplu. De ce ne-am întors la acest subiect? În primul rând, pentru că acum ești bine familiarizat cu mecanismul de moștenire al Java și cu celelalte principii ale OOP. Operatorul instanceof va fi acum mult mai clar și ne vom uita la exemple mai avansate despre cum este utilizat. Să mergem!Cum funcționează instanța operatorului - 1Probabil vă amintiți că operatorul instanceof returnează true dacă verificarea este adevărată sau false dacă expresia este falsă. În consecință, apare de obicei în tot felul de expresii condiționate ( if...else ). Să începem cu câteva exemple mai simple:

public class Main {

   public static void main(String[] args) {

       Integer x = new Integer(22);

       System.out.println(x instanceof Integer);
   }
}
Ce crezi că va fi afișat pe consolă? Ei bine, aici este evident.:) Obiectul x este un număr întreg, deci rezultatul va fi adevărat . Ieșire din consolă: True Să încercăm să verificăm dacă este un String :

public class Main {

   public static void main(String[] args) {

       Integer x = new Integer(22);

       System.out.println(x instanceof String); // Error!
   }
}
Avem o eroare. Și fiți atenți: compilatorul a generat eroarea înainte de a rula codul! A văzut imediat că Integer și String nu pot fi convertite automat unul în celălalt și nu sunt legate prin moștenire. În consecință, un obiect Integer nu este creat pe baza String . Acest lucru este convenabil și ajută la evitarea erorilor ciudate de rulare, așa că compilatorul ne-a ajutat aici :) Acum să încercăm să luăm în considerare exemple care sunt mai dificile. Deoarece am menționat moștenirea, să lucrăm cu următorul mic sistem de clase:

public class Animal {

}

public class Cat extends Animal {

}

public class MaineCoon extends Cat {

}
Știm deja cum se comportă instanceof atunci când verificăm dacă un obiect este o instanță a unei clase, dar ce se întâmplă dacă luăm în considerare relația părinte-copil? De exemplu, ce crezi că vor da aceste expresii:

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

   }
}
Rezultat: Adevărat Fals Principala întrebare la care trebuie răspuns este exact cum interpretează instanceof „obiectul creat pe baza unei clase”? „ cat instanceof Animal ” se evaluează la adevărat , dar cu siguranță putem găsi defecte în această formulare. De ce este creat un obiect Cat pe baza clasei Animal ? Nu este creat doar pe baza propriei sale clase? Răspunsul este destul de simplu și poate te-ai gândit deja la el. Amintiți-vă ordinea în care sunt apelați constructorii și variabilele sunt inițializate atunci când creați un obiect. Am tratat deja acest subiect în articolul despre constructorii de clasă . Iată un exemplu din acea lecție:

public class Animal {

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

   public static int animalCount = 7700000;

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

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

public class Cat extends Animal {

   String tail = "Initial value of tail in the Cat class";

   static int catCount = 37;

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

   public static void main(String[] args) {
       Cat cat = new Cat("Brain", "Heart", "Tail");
   }
}
Și dacă îl rulați în IDE, ieșirea consolei va arăta astfel: Constructorul clasei de bază Animal rulează Au fost inițializate deja variabilele clasei Animal? Valoarea curentă a variabilei statice animalCount = 7700000 Valoarea curentă a creierului în clasa Animal = Valoarea inițială a creierului în clasa Animal Valoarea curentă a inimii în clasa Animal = Valoarea inițială a inimii în clasa Animal Au variabilele clasei Animal deja a fost initializat? Valoarea curentă a variabilei statice catCount = 37 Constructorul clasei de bază pentru animale este finalizat! Valoarea curentă a creierului = creier Valoarea curentă inimă = inimă Constructorul clasei pisici a început (constructorul animal este deja terminat) Valoarea curentă a variabilei statice catCount = 37 Valoarea curentă a cozii = valoarea inițială a cozii în clasa pisicii Valoarea curentă a cozii = Coadă Acum îți amintești?:) Constructorul clasei de bază, dacă există o clasă de bază, este întotdeauna apelat primul la crearea unui obiect. Operatorul instanceof este ghidat de acest principiu atunci când încearcă să determine dacă un obiect A a fost creat pe baza unei clase B. Dacă este apelat constructorul clasei de bază, atunci nu poate exista nicio îndoială. Cu a doua verificare, totul este mai simplu:

System.out.println(cat instanceof MaineCoon);
Constructorul MaineCoon nu a fost apelat când a fost creat obiectul Cat , ceea ce are sens. La urma urmei, MaineCoon este un descendent al lui Cat , nu un strămoș. Și nu este un șablon pentru Cat . Bine, cred că suntem clari. Dar ce se întâmplă dacă facem asta?:

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... acum e mai greu. Hai să vorbim. Avem o variabilă Cat căreia i-am atribuit un obiect MaineCoon . Apropo, de ce funcționează? Putem face asta, nu? Da putem. La urma urmei, fiecare MaineCoon este o pisică. Dacă acest lucru nu este complet clar, amintiți-vă exemplul de extindere a tipurilor primitive:

public class Main {

   public static void main(String[] args) {

       long x = 1024;

   }
}
Numărul 1024 este scurt : se încadrează cu ușurință într-o variabilă lungă , deoarece există destui octeți pentru a-l găzdui (vă amintiți exemplul cu păpușile?). Un obiect descendent poate fi întotdeauna atribuit unei variabile strămoși. Deocamdată, amintiți-vă acest lucru și în lecțiile ulterioare vom analiza cum funcționează. Deci, ce iese exemplul nostru?

Cat cat = new MaineCoon();
System.out.println(cat instanceof Cat);
System.out.println(cat instanceof MaineCoon);
Ce va verifica instanța ? variabila noastră Cat sau obiectul nostru MaineCoon ? Răspunsul este că această întrebare este de fapt simplă. Trebuie doar să citiți din nou definiția operatorului: operatorul instanceof este necesar pentru a verifica dacă un obiect referit de o variabilă X a fost creat pe baza unei clase Y. Operatorul instanceof testează originea unui obiect, nu tipul variabilei. Astfel, în acest exemplu, programul nostru va afișa adevărat în ambele cazuri: avem un obiect MaineCoon . Evident, a fost creat pe baza clasei MaineCoon , dar a fost creat pe baza Catsi clasa de parinti!
Comentarii
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION