CodeGym /Java blog /Tilfældig /Java-instans af operatør
John Squirrels
Niveau
San Francisco

Java-instans af operatør

Udgivet i gruppen
Hej! I dag vil vi tale om instansen af ​​operatør, overveje eksempler på, hvordan den bruges, og berøre nogle aspekter af, hvordan den virker:) Du har allerede stødt på denne operatør på et tidligt niveau af CodeGym. Kan du huske, hvorfor vi har brug for det? Hvis ikke, ingen bekymringer. Lad os huske sammen. Instanceof - operatoren er nødvendig for at kontrollere, om et objekt, der refereres til af en X- variabel, blev oprettet baseret på en eller anden Y- klasse. Det lyder simpelt. Hvorfor er vi vendt tilbage til dette emne? Først og fremmest, fordi du nu er godt bekendt med Javas arvemekanisme og de andre principper i OOP. Forekomsten af ​​operatør vil nu være meget klarere, og vi vil se på mere avancerede eksempler på, hvordan den bruges. Lad os gå!Sådan fungerer instansen af ​​operatøren - 1Du husker sikkert, at instansen af ​​operatoren returnerer sand , hvis kontrollen evalueres til sand, eller falsk , hvis udtrykket er falsk. Følgelig forekommer det normalt i alle mulige betingede udtryk ( hvis … andet ). Lad os starte med nogle simplere eksempler:

public class Main {

   public static void main(String[] args) {

       Integer x = new Integer(22);

       System.out.println(x instanceof Integer);
   }
}
Hvad tror du vil blive vist på konsollen? Nå, det er tydeligt her. :) x -objektet er et heltal, så resultatet bliver sandt . Konsoloutput: Sand Lad os prøve at tjekke, om det er en streng :

public class Main {

   public static void main(String[] args) {

       Integer x = new Integer(22);

       System.out.println(x instanceof String); // Error!
   }
}
Vi fik en fejl. Og vær opmærksom: compileren genererede fejlen, før den kørte koden! Det så med det samme, at heltal og streng ikke automatisk kan konverteres til hinanden og ikke er relateret gennem arv. Derfor oprettes et heltalsobjekt ikke baseret på String . Dette er praktisk og hjælper med at undgå mærkelige runtime fejl, så compileren hjalp os her :) Lad os nu prøve at overveje eksempler, der er vanskeligere. Da vi nævnte arv, lad os arbejde med følgende lille system af klasser:

public class Animal {

}

public class Cat extends Animal {

}

public class MaineCoon extends Cat {

}
Vi ved allerede, hvordan instanceof opfører sig, når vi tjekker, om et objekt er en forekomst af en klasse, men hvad sker der, hvis vi overvejer forholdet mellem forældre og barn? For eksempel, hvad tror du, disse udtryk vil give:

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

   }
}
Output: Sandt Falsk Det vigtigste spørgsmål, der skal besvares, er præcis, hvordan instanceof fortolker 'objekt skabt baseret på en klasse'? ' cat instanceof Animal ' vurderes til at være sandt , men vi kan helt sikkert finde fejl i den formulering. Hvorfor oprettes et Cat- objekt baseret på Animal- klassen? Er det ikke skabt ud fra sin egen klasse alene? Svaret er simpelt nok, og du har måske allerede tænkt på det. Husk den rækkefølge, hvori konstruktører kaldes og variabler initialiseres, når du opretter et objekt. Vi har allerede dækket dette emne i artiklen om klassekonstruktører . Her er et eksempel fra den lektion:

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");
   }
}
Og hvis du kører det i IDE, vil konsoloutputtet se sådan her ud: Animal base class constructor kører Er variablerne i Animal klassen allerede blevet initialiseret? Aktuel værdi af statisk variabel animalCount = 7700000 Aktuel værdi af hjerne i dyreklassen = Startværdi af hjerne i dyreklassen Nuværende værdi af hjerte i dyreklassen = Startværdi af hjerte i dyreklassen Har variablerne for Cat-klassen allerede blevet initialiseret? Aktuel værdi af statisk variabel catCount = 37 Dyrebaseklassekonstruktør er færdig! Aktuel værdi af hjerne = Hjerne Aktuel værdi hjerte = Hjerte Katteklassekonstruktøren er startet (Dyrekonstruktøren er allerede færdig) Aktuel værdi af statisk variabel catCount = 37 Aktuel værdi af hale = Startværdi af hale i Cat-klassen Aktuel værdi af hale = Hale Husker du nu?:) Konstruktøren af ​​basisklassen, hvis der er en basisklasse, kaldes altid først, når du opretter et objekt. Operatørens instans er styret af dette princip, når det forsøger at bestemme, om et A- objekt blev oprettet baseret på en B- klasse. Hvis basisklassekonstruktøren kaldes, kan der ikke være nogen tvivl. Med den anden kontrol er alt enklere:

System.out.println(cat instanceof MaineCoon);
MaineCoon - konstruktøren blev ikke kaldt, da Cat- objektet blev oprettet, hvilket giver mening. MaineCoon er trods alt en efterkommer af Cat , ikke en forfader. Og det er ikke en skabelon for Cat . Okay, det tror jeg, vi er klare over. Men hvad sker der, hvis vi gør dette?:

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... nu er det sværere. Lad os tale om det. Vi har en Cat- variabel, som vi har tildelt et MaineCoon- objekt. Forresten, hvorfor virker det overhovedet? Det kan vi godt, ikke? Ja vi kan. Når alt kommer til alt, er enhver MaineCoon en kat. Hvis det ikke er helt klart, så husk eksemplet med at udvide primitive typer:

public class Main {

   public static void main(String[] args) {

       long x = 1024;

   }
}
Tallet 1024 er kort : det passer nemt ind i en lang variabel, da der er nok bytes til at rumme det (kan du huske eksemplet med dukkerne?). Et efterkommerobjekt kan altid tildeles en stamvariabel. Indtil videre skal du bare huske dette, og i de efterfølgende lektioner vil vi analysere, hvordan det fungerer. Så hvad viser vores eksempel?

Cat cat = new MaineCoon();
System.out.println(cat instanceof Cat);
System.out.println(cat instanceof MaineCoon);
Hvad vil forekomst af kontrollere? vores Cat- variabel eller vores MaineCoon- objekt? Svaret er, at dette spørgsmål faktisk er enkelt. Du skal bare læse definitionen af ​​operatoren igen: Instanceof- operatoren er nødvendig for at kontrollere, om et objekt, der refereres til af en X- variabel, blev oprettet baseret på en eller anden Y- klasse. Instanceof - operatoren tester oprindelsen af ​​et objekt, ikke variabeltypen. I dette eksempel vil vores program således vise sand i begge tilfælde: vi har et MaineCoon -objekt. Det er klart, det blev skabt baseret på MaineCoon -klassen, men det blev skabt baseret på Catogså forældreklasse!
Kommentarer
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION