CodeGym /Java-Blog /Random-DE /Java-Instanz des Operators
Autor
Jesse Haniel
Lead Software Architect at Tribunal de Justiça da Paraíba

Java-Instanz des Operators

Veröffentlicht in der Gruppe Random-DE
Hallo! Heute werden wir über den Instanzoperator sprechen , Beispiele für seine Verwendung betrachten und einige Aspekte seiner Funktionsweise ansprechen:) Sie sind diesem Operator bereits in frühen Versionen von CodeGym begegnet. Erinnern Sie sich, warum wir es brauchen? Wenn nicht, keine Sorge. Erinnern wir uns gemeinsam. Der Instanzoperator wird benötigt, um zu überprüfen, ob ein Objekt, auf das von einer X- Variablen verwiesen wird, basierend auf einer Y- Klasse erstellt wurde. Das klingt einfach. Warum sind wir zu diesem Thema zurückgekehrt? Erstens, weil Sie jetzt mit dem Vererbungsmechanismus von Java und den anderen Prinzipien von OOP gut vertraut sind. Der Instanzoperator wird jetzt viel klarer sein und wir werden uns fortgeschrittenere Beispiele für seine Verwendung ansehen. Lass uns gehen!So funktioniert der Instanceof-Operator – 1Sie erinnern sich wahrscheinlich daran, dass der Operator „ instanceof “ „ true“ zurückgibt , wenn die Prüfung „true“ ergibt, oder „ false“ , wenn der Ausdruck „false“ ist. Dementsprechend kommt es normalerweise in allen Arten von bedingten Ausdrücken vor ( if…else ). Beginnen wir mit einigen einfacheren Beispielen:

public class Main {

   public static void main(String[] args) {

       Integer x = new Integer(22);

       System.out.println(x instanceof Integer);
   }
}
Was wird Ihrer Meinung nach auf der Konsole angezeigt? Nun, hier ist es offensichtlich.:) Das x- Objekt ist eine Ganzzahl, daher ist das Ergebnis true . Konsolenausgabe: True Versuchen wir zu prüfen, ob es sich um einen String handelt :

public class Main {

   public static void main(String[] args) {

       Integer x = new Integer(22);

       System.out.println(x instanceof String); // Error!
   }
}
Es ist ein Fehler aufgetreten. Und aufgepasst: Der Compiler hat den Fehler generiert, bevor er den Code ausgeführt hat! Es wurde sofort erkannt, dass Integer und String nicht automatisch ineinander konvertiert werden können und nicht durch Vererbung miteinander verbunden sind. Folglich wird kein Integer-Objekt basierend auf String erstellt . Das ist praktisch und hilft, seltsame Laufzeitfehler zu vermeiden, daher hat uns hier der Compiler geholfen :) Versuchen wir nun, schwierigere Beispiele zu betrachten. Da wir die Vererbung erwähnt haben, arbeiten wir mit dem folgenden kleinen Klassensystem:

public class Animal {

}

public class Cat extends Animal {

}

public class MaineCoon extends Cat {

}
Wir wissen bereits, wie sich „instanceof“ verhält, wenn wir prüfen, ob ein Objekt eine Instanz einer Klasse ist, aber was passiert, wenn wir die Eltern-Kind-Beziehung berücksichtigen? Was glauben Sie beispielsweise, was diese Ausdrücke ergeben werden:

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

   }
}
Ausgabe: Richtig Falsch Die Hauptfrage, die beantwortet werden muss, ist genau, wie „ Instanceof “ „Objekt, das auf der Grundlage einer Klasse erstellt wurde“ interpretiert. „ cat exampleof Animal “ wird als „ true“ ausgewertet , aber an dieser Formulierung können wir sicherlich etwas auszusetzen haben. Warum wird ein Cat- Objekt basierend auf der Animal- Klasse erstellt? Wird es nicht allein auf der Grundlage seiner eigenen Klasse erstellt? Die Antwort ist ganz einfach, und Sie haben vielleicht schon darüber nachgedacht. Denken Sie beim Erstellen eines Objekts an die Reihenfolge, in der Konstruktoren aufgerufen und Variablen initialisiert werden. Wir haben dieses Thema bereits im Artikel über Klassenkonstruktoren behandelt . Hier ist ein Beispiel aus dieser 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");
   }
}
Und wenn Sie es in der IDE ausführen, sieht die Konsolenausgabe so aus: Der Konstruktor der Animal-Basisklasse wird ausgeführt. Wurden die Variablen der Animal-Klasse bereits initialisiert? Aktueller Wert der statischen Variablen animalCount = 7700000 Aktueller Wert von brain in der Animal-Klasse = Anfangswert von brain in der Animal-Klasse Aktueller Wert von heart in der Animal-Klasse = Anfangswert von heart in der Animal-Klasse Die Variablen der Cat-Klasse sind bereits vorhanden wurde initialisiert? Aktueller Wert der statischen Variablen catCount = 37 Der Konstruktor der Tier-Basisklasse ist fertig! Aktueller Wert von brain = Brain Aktueller Wert heart = Heart Der Cat-Klassenkonstruktor wurde gestartet (Der Animal-Konstruktor ist bereits fertig) Aktueller Wert der statischen Variablen catCount = 37 Aktueller Wert von tail = Anfangswert von tail in der Cat-Klasse Aktueller Wert von tail = Schwanz Erinnern Sie sich jetzt?:) Der Konstruktor der Basisklasse wird, wenn es eine Basisklasse gibt, beim Erstellen eines Objekts immer zuerst aufgerufen. Der Instanzoperator orientiert sich an diesem Prinzip, wenn er ermitteln möchte, ob ein A- Objekt basierend auf einer B- Klasse erstellt wurde. Wenn der Basisklassenkonstruktor aufgerufen wird, besteht kein Zweifel. Mit der zweiten Prüfung ist alles einfacher:

System.out.println(cat instanceof MaineCoon);
Der MaineCoon- Konstruktor wurde beim Erstellen des Cat- Objekts nicht aufgerufen , was Sinn macht. Schließlich ist MaineCoon ein Nachkomme von Cat und kein Vorfahre. Und es ist keine Vorlage für Cat . Okay, ich denke, darüber sind wir uns im Klaren. Aber was passiert, wenn wir das tun?:

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... das ist jetzt schwieriger. Lass uns darüber reden. Wir haben eine Cat- Variable, der wir ein MaineCoon- Objekt zugewiesen haben. Übrigens, warum funktioniert das überhaupt? Wir können das schaffen, oder? Ja wir können. Schließlich ist jede MaineCoon eine Katze. Wenn das nicht ganz klar ist, erinnern Sie sich an das Beispiel der Erweiterung primitiver Typen:

public class Main {

   public static void main(String[] args) {

       long x = 1024;

   }
}
Die Zahl 1024 ist eine kurze Zahl : Sie passt problemlos in eine lange Variable, da genügend Bytes vorhanden sind, um sie aufzunehmen (erinnern Sie sich an das Beispiel mit den Puppen?). Ein Nachkommenobjekt kann immer einer Vorgängervariablen zugewiesen werden. Merken Sie sich dies vorerst. In den folgenden Lektionen werden wir analysieren, wie es funktioniert. Was gibt unser Beispiel also aus?

Cat cat = new MaineCoon();
System.out.println(cat instanceof Cat);
System.out.println(cat instanceof MaineCoon);
Was wird durch die Instanz überprüft? unsere Cat- Variable oder unser MaineCoon- Objekt? Die Antwort ist, dass diese Frage eigentlich einfach ist. Sie müssen nur noch einmal die Definition des Operators lesen: Der Operator „ instanceof“ wird benötigt, um zu überprüfen, ob ein Objekt, auf das eine X- Variable verweist, auf Basis einer Y- Klasse erstellt wurde. Der Instanzoperator testet den Ursprung eines Objekts, nicht den Variablentyp. Daher zeigt unser Programm in diesem Beispiel in beiden Fällen true an: Wir haben ein MaineCoon- Objekt. Offensichtlich wurde es auf Basis der MaineCoon- Klasse erstellt, aber es wurde auf Basis von Cat erstelltElternklasse auch!
Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION