CodeGym /Java blogg /Slumpmässig /Java-instans av Operatör
John Squirrels
Nivå
San Francisco

Java-instans av Operatör

Publicerad i gruppen
Hej! Idag ska vi prata om operatörens instans , överväga exempel på hur den används och beröra några aspekter av hur den fungerar:) Du har redan stött på den här operatören på tidiga nivåer av CodeGym. Kommer du ihåg varför vi behöver det? Om inte, inga bekymmer. Låt oss minnas tillsammans. Instanceof - operatorn behövs för att kontrollera om ett objekt som refereras till av en X -variabel har skapats baserat på någon Y- klass. Det låter enkelt. Varför har vi återvänt till detta ämne? Först och främst, för nu är du väl bekant med Javas arvsmekanism och de andra principerna för OOP. Operatörsinstansen kommer nu att bli mycket tydligare och vi ska titta på mer avancerade exempel på hur den används . Nu går vi!Hur instansen av operatorn fungerar - 1Du kommer säkert ihåg att operatorn instanceof returnerar true om kontrollen utvärderas till true, eller false om uttrycket är falskt. Följaktligen förekommer det vanligtvis i alla möjliga villkorliga uttryck ( om...annat ) . Låt oss börja med några enklare exempel:

public class Main {

   public static void main(String[] args) {

       Integer x = new Integer(22);

       System.out.println(x instanceof Integer);
   }
}
Vad tror du kommer att visas på konsolen? Tja, det är uppenbart här. :) x -objektet är ett heltal, så resultatet blir sant . Konsolutgång: Sant Låt oss försöka kontrollera om det är en sträng :

public class Main {

   public static void main(String[] args) {

       Integer x = new Integer(22);

       System.out.println(x instanceof String); // Error!
   }
}
Vi fick ett fel. Och var uppmärksam: kompilatorn genererade felet innan koden kördes! Den såg direkt att heltal och sträng inte kan konverteras automatiskt till varandra och inte är relaterade genom arv. Följaktligen skapas inte ett heltalsobjekt baserat på String . Detta är bekvämt och hjälper till att undvika konstiga körtidsfel, så kompilatorn hjälpte oss här :) Låt oss nu försöka överväga exempel som är svårare. Eftersom vi nämnde arv, låt oss arbeta med följande lilla system av klasser:

public class Animal {

}

public class Cat extends Animal {

}

public class MaineCoon extends Cat {

}
Vi vet redan hur instanceof beter sig när vi kontrollerar om ett objekt är en instans av en klass, men vad händer om vi tar hänsyn till förälder-barn-relationen? Till exempel, vad tror du att dessa uttryck kommer att ge:

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

   }
}
Utdata: Sant Falskt Huvudfrågan som behöver besvaras är exakt hur instanceof tolkar 'objekt skapat baserat på en klass'? " cat instans av Animal " bedöms vara sant , men vi kan säkert hitta fel med den formuleringen. Varför skapas ett Cat- objekt baserat på Animal -klassen? Är det inte skapat enbart utifrån sin egen klass? Svaret är enkelt nog, och du kanske redan har tänkt på det. Kom ihåg i vilken ordning konstruktörer anropas och variabler initieras när du skapar ett objekt. Vi har redan behandlat detta ämne i artikeln om klasskonstruktörer . Här är ett exempel från den lektionen:

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");
   }
}
Och om du kör det i IDE, kommer konsolutgången att se ut så här: Animal base class constructor körs Har variablerna för Animal-klassen redan initierats? Aktuellt värde för statisk variabel animalCount = 7700000 Aktuellt värde för hjärnan i klassen Animal = Initialt värde på hjärnan i klassen Animal Aktuellt värde på hjärta i klassen Animal = Initialt värde på hjärta i klassen Animal Har variablerna för klassen Cat redan har initierats? Aktuellt värde för statisk variabel catCount = 37 Djurbasklasskonstruktör är klar! Aktuellt värde för hjärna = Hjärna Aktuellt värde hjärta = Hjärta Kattklasskonstruktören har startat (Djurkonstruktören är redan klar) Aktuellt värde för statisk variabel catCount = 37 Aktuellt värde för svans = Initialt värde för svans i Katt-klassen Aktuellt värde på svans = Svans Kommer du ihåg nu?:) Konstruktören av basklassen, om det finns en basklass, anropas alltid först när man skapar ett objekt. Operatörsinstansen styrs av denna princip när man försöker avgöra om ett A -objekt skapades baserat på en B- klass . Om basklasskonstruktorn anropas kan det inte råda några tvivel. Med den andra kontrollen är allt enklare:

System.out.println(cat instanceof MaineCoon);
MaineCoon - konstruktören anropades inte när Cat -objektet skapades, vilket är vettigt. När allt kommer omkring är MaineCoon en ättling till Cat , inte en förfader. Och det är inte en mall för Cat . Okej, jag tror att vi är tydliga med det. Men vad händer om vi gör detta?:

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 är det svårare. Låt oss prata om det. Vi har en Cat -variabel som vi tilldelade ett MaineCoon -objekt till. Förresten, varför fungerar det ens? Det kan vi väl göra? Ja det kan vi. När allt kommer omkring är varje MaineCoon en katt. Om det inte är helt klart, kom ihåg exemplet med utvidgning av primitiva typer:

public class Main {

   public static void main(String[] args) {

       long x = 1024;

   }
}
Siffran 1024 är ett kort : det passar lätt in i en lång variabel, eftersom det finns tillräckligt med byte för att rymma det (minns du exemplet med dockorna?). Ett descendant objekt kan alltid tilldelas en förfadervariabel. För nu, kom bara ihåg detta, och i efterföljande lektioner kommer vi att analysera hur det fungerar. Så vad ger vårt exempel ut?

Cat cat = new MaineCoon();
System.out.println(cat instanceof Cat);
System.out.println(cat instanceof MaineCoon);
Vad kommer instans av att kontrollera? vår Cat- variabel eller vårt MaineCoon -objekt? Svaret är att denna fråga faktiskt är enkel. Du behöver bara läsa definitionen av operatorn igen: Instanceof -operatorn behövs för att kontrollera om ett objekt som refereras till av en X- variabel har skapats baserat på någon Y- klass. Operatorn instanceof testar ursprunget för ett objekt, inte variabeltypen. Så i det här exemplet kommer vårt program att visa sant i båda fallen: vi har ett MaineCoon- objekt. Uppenbarligen skapades den utifrån MaineCoon -klassen, men den skapades utifrån Catföräldraklass också!
Kommentarer
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION