CodeGym /Java-blogg /Tilfeldig /Java-forekomst av operatør
John Squirrels
Nivå
San Francisco

Java-forekomst av operatør

Publisert i gruppen
Hei! I dag skal vi snakke om forekomsten av operatøren, vurdere eksempler på hvordan den brukes, og berøre noen aspekter av hvordan den fungerer:) Du har allerede møtt denne operatøren på tidlige nivåer av CodeGym. Husker du hvorfor vi trenger det? Hvis ikke, ingen bekymringer. La oss huske sammen. Forekomsten av operatoren er nødvendig for å sjekke om et objekt referert til av en X- variabel ble opprettet basert på en Y- klasse. Det høres enkelt ut. Hvorfor har vi gått tilbake til dette temaet? Først av alt, fordi nå er du godt kjent med Javas arvemekanisme og de andre prinsippene for OOP. Forekomsten av operatør vil nå være mye klarere, og vi skal se på mer avanserte eksempler på hvordan den brukes. La oss gå!Hvordan instansen av operatøren fungerer - 1Du husker sikkert at instanceof- operatoren returnerer true hvis sjekken evalueres til true, eller false hvis uttrykket er usant. Følgelig forekommer det vanligvis i alle slags betingede uttrykk ( hvis ... annet ). La oss starte med noen enklere eksempler:

public class Main {

   public static void main(String[] args) {

       Integer x = new Integer(22);

       System.out.println(x instanceof Integer);
   }
}
Hva tror du vil vises på konsollen? Vel, det er åpenbart her. :) x -objektet er et heltall, så resultatet vil være sant . Konsollutgang: Sant La oss prøve å sjekke 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 fikk en feil. Og vær oppmerksom: kompilatoren genererte feilen før koden kjørte! Den så umiddelbart at heltall og streng ikke automatisk kan konverteres til hverandre og ikke er relatert gjennom arv. Følgelig opprettes ikke et heltallsobjekt basert på streng . Dette er praktisk og bidrar til å unngå merkelige kjøretidsfeil, så kompilatoren hjalp oss her :) La oss nå prøve å vurdere eksempler som er vanskeligere. Siden vi nevnte arv, la oss jobbe med følgende lille system med klasser:

public class Animal {

}

public class Cat extends Animal {

}

public class MaineCoon extends Cat {

}
Vi vet allerede hvordan instanceof oppfører seg når vi sjekker om et objekt er en forekomst av en klasse, men hva skjer hvis vi vurderer forholdet mellom foreldre og barn? For eksempel, hva tror du disse uttrykkene vil gi:

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: True Usant Hovedspørsmålet som må besvares er nøyaktig hvordan instanceof tolker 'objekt opprettet basert på en klasse'? ' cat instance of Animal ' vurderes til å være sant , men vi kan sikkert finne feil med den formuleringen. Hvorfor lages et Cat- objekt basert på Animal- klassen? Er det ikke skapt basert på sin egen klasse alene? Svaret er enkelt nok, og du har kanskje allerede tenkt på det. Husk rekkefølgen som konstruktører kalles og variabler initialiseres når du oppretter et objekt. Vi dekket allerede dette emnet i artikkelen om klassekonstruktører . Her er et eksempel fra den leksjonen:

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 kjører det i IDE, vil konsollutgangen se slik ut: Animal base class constructor kjører Har variablene til Animal-klassen allerede blitt initialisert? Gjeldende verdi av statisk variabel animalCount = 7700000 Gjeldende verdi av hjernen i dyreklassen = Startverdien av hjernen i dyreklassen Nåværende verdi på hjertet i dyreklassen = Startverdien til hjertet i dyreklassen Har variablene til katteklassen allerede blitt initialisert? Gjeldende verdi av statisk variabel catCount = 37 Dyrebaseklassekonstruktør er ferdig! Gjeldende verdi av hjerne = Hjerne Gjeldende verdi hjerte = Hjerte Katteklassekonstruktøren har startet (Dyrekonstruktøren er allerede ferdig) Gjeldende verdi av statisk variabel catCount = 37 Gjeldende verdi av hale = Startverdi av hale i Cat-klassen Gjeldende verdi av hale = Hale Husker du nå?:) Konstruktøren av basisklassen, hvis det er en basisklasse, kalles alltid først når du lager et objekt. Forekomsten av operatør styres av dette prinsippet når man prøver å bestemme om et A- objekt ble opprettet basert på en B- klasse. Hvis basisklassekonstruktøren kalles, kan det ikke være noen tvil. Med den andre sjekken er alt enklere:

System.out.println(cat instanceof MaineCoon);
MaineCoon - konstruktøren ble ikke kalt da Cat- objektet ble opprettet, noe som er fornuftig. Tross alt er MaineCoon en etterkommer av Cat , ikke en stamfar. Og det er ikke en mal for Cat . Ok, jeg tror vi er klare på det. Men hva skjer hvis vi gjø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... nå er det vanskeligere. La oss snakke om det. Vi har en Cat- variabel som vi har tildelt et MaineCoon- objekt. Forresten, hvorfor fungerer det i det hele tatt? Vi kan gjøre det, ikke sant? Ja vi kan. Tross alt er hver MaineCoon en katt. Hvis det ikke er helt klart, husk eksemplet med utvidede primitive typer:

public class Main {

   public static void main(String[] args) {

       long x = 1024;

   }
}
Tallet 1024 er kort : det passer lett inn i en lang variabel, siden det er nok byte til å romme det (husker du eksemplet med dukkene?). Et etterkommerobjekt kan alltid tilordnes til en stamvariabel. For nå, bare husk dette, og i påfølgende leksjoner vil vi analysere hvordan det fungerer. Så hva gir eksempelet vårt?

Cat cat = new MaineCoon();
System.out.println(cat instanceof Cat);
System.out.println(cat instanceof MaineCoon);
Hva vil forekomst av sjekke? vår Cat- variabel eller vårt MaineCoon -objekt? Svaret er at dette spørsmålet faktisk er enkelt. Du trenger bare å lese definisjonen av operatoren igjen: Instanceof- operatoren er nødvendig for å sjekke om et objekt referert til av en X- variabel ble opprettet basert på en Y- klasse. Instanceof - operatoren tester opprinnelsen til et objekt, ikke variabeltypen. Derfor, i dette eksemplet, vil programmet vårt vise sant i begge tilfeller: vi har et MaineCoon -objekt. Det er klart at det ble laget basert på MaineCoon -klassen, men det ble laget basert på Catogså foreldreklassen!
Kommentarer
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION