CodeGym /Java Blog /Willekeurig /Java-instantie van Operator
John Squirrels
Niveau 41
San Francisco

Java-instantie van Operator

Gepubliceerd in de groep Willekeurig
Hoi! Vandaag zullen we het hebben over de instantie van operator, voorbeelden bekijken van hoe het wordt gebruikt en enkele aspecten van hoe het werkt bespreken:) Je bent deze operator al tegengekomen op vroege niveaus van CodeGym. Weet je nog waarom we het nodig hebben? Zo niet, geen zorgen. Laten we samen herinneren. De operator instanceof is nodig om te controleren of een object waarnaar wordt verwezen door een X- variabele is gemaakt op basis van een bepaalde Y- klasse. Dat klinkt eenvoudig. Waarom zijn we teruggekomen op dit onderwerp? Allereerst omdat je nu goed bekend bent met Java's overervingsmechanisme en de andere principes van OOP. De instanceof- operator zal nu veel duidelijker zijn en we zullen meer geavanceerde voorbeelden bekijken van hoe deze wordt gebruikt. Laten we gaan!Hoe de instanceof-operator werkt - 1U herinnert zich waarschijnlijk dat de operator instanceof true retourneert als de controle resulteert in true, of false als de expressie false is. Dienovereenkomstig komt het meestal voor in allerlei voorwaardelijke uitdrukkingen ( if…else ). Laten we beginnen met enkele eenvoudigere voorbeelden:

public class Main {

   public static void main(String[] args) {

       Integer x = new Integer(22);

       System.out.println(x instanceof Integer);
   }
}
Wat denk je dat er op de console wordt weergegeven? Nou, het is hier duidelijk. :) Het x- object is een geheel getal, dus het resultaat zal waar zijn . Console-uitvoer: True Laten we proberen te controleren of het een string is :

public class Main {

   public static void main(String[] args) {

       Integer x = new Integer(22);

       System.out.println(x instanceof String); // Error!
   }
}
We hebben een fout. En let op: de compiler heeft de fout gegenereerd voordat de code werd uitgevoerd! Het zag meteen dat Integer en String niet automatisch naar elkaar kunnen worden omgezet en niet gerelateerd zijn door overerving. Bijgevolg wordt er geen Integer-object gemaakt op basis van String . Dit is handig en helpt vreemde runtime-fouten te voorkomen, dus de compiler heeft ons hier geholpen :) Laten we nu proberen voorbeelden te bekijken die moeilijker zijn. Aangezien we het over overerving hadden, gaan we aan de slag met het volgende kleine systeem van klassen:

public class Animal {

}

public class Cat extends Animal {

}

public class MaineCoon extends Cat {

}
We weten al hoe instanceof zich gedraagt ​​als we controleren of een object een instantie van een klasse is, maar wat gebeurt er als we kijken naar de ouder-kindrelatie? Wat denk je bijvoorbeeld dat deze uitdrukkingen zullen opleveren:

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

   }
}
Uitvoer: True False De belangrijkste vraag die moet worden beantwoord, is hoe instanceof 'object gemaakt op basis van een klasse' precies interpreteert? ' cat instanceof Animal ' resulteert in true , maar we kunnen zeker fouten vinden in die bewoording. Waarom wordt een Cat- object gemaakt op basis van de klasse Animal ? Is het niet alleen gemaakt op basis van zijn eigen klasse? Het antwoord is eenvoudig genoeg en misschien heb je er al aan gedacht. Onthoud de volgorde waarin constructors worden aangeroepen en variabelen worden geïnitialiseerd bij het maken van een object. We hebben dit onderwerp al behandeld in het artikel over klassenbouwers . Hier is een voorbeeld uit die les:

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");
   }
}
En als u het in de IDE uitvoert, ziet de console-uitvoer er als volgt uit: De constructor van de Animal-basisklasse draait. Zijn de variabelen van de Animal-klasse al geïnitialiseerd? Huidige waarde van statische variabele animalCount = 7700000 Huidige waarde van hersenen in de Animal-klasse = Beginwaarde van hersenen in de Animal-klasse Huidige waarde van hart in de Animal-klasse = Beginwaarde van hart in de Animal-klasse Beschikken al over de variabelen van de Cat-klasse geïnitialiseerd? Huidige waarde van statische variabele catCount = 37 Constructor basisklasse dier is klaar! Huidige waarde van hersenen = Hersenen Huidige waarde hart = Hart De cat class constructor is gestart (De Animal constructor is al klaar) Huidige waarde van statische variabele catCount = 37 Huidige waarde van staart = Beginwaarde van staart in de Cat klasse Huidige waarde van staart = Staart Weet je het nog?:) De constructor van de basisklasse, als er een basisklasse is, wordt altijd als eerste aangeroepen bij het maken van een object. De instanceof- operator laat zich door dit principe leiden wanneer hij probeert vast te stellen of een A- object is gemaakt op basis van een B- klasse. Als de constructor van de basisklasse wordt aangeroepen, kan er geen twijfel over bestaan. Met de tweede controle is alles eenvoudiger:

System.out.println(cat instanceof MaineCoon);
De MaineCoon- constructor werd niet aangeroepen toen het Cat- object werd gemaakt, wat logisch is. MaineCoon is tenslotte een afstammeling van Cat , geen voorouder. En het is geen sjabloon voor Cat . Oké, ik denk dat we daar duidelijk over zijn. Maar wat gebeurt er als we dit doen?:

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... dat is nu moeilijker. Laten we erover praten. We hebben een Cat- variabele waaraan we een MaineCoon- object hebben toegewezen. Trouwens, waarom werkt dat eigenlijk? Dat kunnen we toch? Ja dat kunnen we. Elke MaineCoon is tenslotte een kat. Als dat niet helemaal duidelijk is, onthoud dan het voorbeeld van verbredende primitieve typen:

public class Main {

   public static void main(String[] args) {

       long x = 1024;

   }
}
Het getal 1024 is een kort getal : het past gemakkelijk in een lange variabele, aangezien er genoeg bytes zijn om het op te nemen (herinner je je het voorbeeld met de poppen?). Een descendant-object kan altijd worden toegewezen aan een vooroudervariabele. Onthoud dit voorlopig, en in volgende lessen zullen we analyseren hoe het werkt. Dus wat levert ons voorbeeld op?

Cat cat = new MaineCoon();
System.out.println(cat instanceof Cat);
System.out.println(cat instanceof MaineCoon);
Wat zal instantie controleren? onze Cat- variabele of ons MaineCoon- object? Het antwoord is dat deze vraag eigenlijk simpel is. U hoeft alleen de definitie van de operator opnieuw te lezen: de instanceof- operator is nodig om te controleren of een object waarnaar wordt verwezen door een X- variabele is gemaakt op basis van een bepaalde Y- klasse. De operator instanceof test de oorsprong van een object, niet het type variabele. Dus in dit voorbeeld zal ons programma in beide gevallen true weergeven : we hebben een MaineCoon- object. Het is duidelijk gemaakt op basis van de MaineCoon- klasse, maar het is gemaakt op basis van de Catook ouderklasse!
Opmerkingen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION