JavaRush /Java-Blog /Random-DE /Instanz des Operators in Java

Instanz des Operators in Java

Veröffentlicht in der Gruppe Random-DE
Hallo! Heute werden wir über den Instanzoperator sprechen, Beispiele für seine Verwendung betrachten und einige Punkte im Zusammenhang mit seiner Funktionsweise ansprechen :) Auf den frühen Ebenen von JavaRush sind Sie bereits auf diesen Operator gestoßen. Erinnern Sie sich, warum es nötig ist? Wenn nicht, spielt es keine Rolle, lasst uns gemeinsam daran denken. Der Operator „instanceof“ wird benötigt, um zu prüfen, ob das von der Variable X referenzierte Objekt aus einer Klasse Y erstellt wurde. Klingt einfach. Warum sind wir zu diesem Thema zurückgekehrt? Erstens, weil Sie jetzt mit dem Vererbungsmechanismus in Java und anderen OOP-Prinzipien gut vertraut sind. Das Thema Instanz von wird viel klarer sein und wir werden uns mit fortgeschritteneren Anwendungsfällen befassen. Gehen! Wie funktioniert der Instanceof-Operator – 1Sie erinnern sich wahrscheinlich daran, dass der Operator „instanceof“ „ true “ zurückgibt , wenn der Test wahr war, oder „ false“ , wenn das Ergebnis falsch war. Folglich kommt es am häufigsten bei verschiedenen Arten von Testbedingungen vor ( if…else). Beginnen wir mit 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 ausgegeben? Nun, hier ist es offensichtlich :) Das Objekt хist eine Ganzzahl, also ist das Ergebnis true . Konsolenausgabe: true Versuchen wir zu überprüfen, ob es beispielsweise zu String gehört:
public class Main {

   public static void main(String[] args) {

       Integer x = new Integer(22);

       System.out.println(x instanceof String);// Fehler!
   }
}
Wir haben eine Fehlermeldung erhalten. Und aufgepasst: Der Compiler hat es ausgegeben, noch bevor der Code ausgeführt wurde! Er erkannte sofort, dass Integer und String nicht automatisch ineinander konvertiert werden können und keine Vererbungsbeziehungen bestehen. Daher wird aus dem String kein Integer-Klassenobjekt erstellt. Das ist praktisch und hilft, seltsame Fehler bereits während der Programmausführung zu vermeiden, daher hat uns hier der Compiler geholfen :) Versuchen wir nun, uns komplexere Beispiele anzusehen. Da wir die Vererbung erwähnt haben, arbeiten wir mit diesem 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 im Normalfall prüfen, ob ein Objekt zu einer Klasse gehört, aber was passiert, wenn wir hier eine Eltern-Kind-Beziehung hinzufügen? Wie funktioniert der Instanceof-Operator – 2 Was glauben Sie beispielsweise, was die folgende Prüfung ergeben wird:
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: wahr, falsch. Die Hauptfrage, die beantwortet werden muss, ist, wie genau die Instanz von das Konzept eines „Objekts, das auf der Grundlage einer Klasse erstellt wurde“ entschlüsselt. Als Ergebnis haben wir es verstanden Сat instanceof Animal == true, aber an einer solchen Formulierung kann man etwas auszusetzen haben. Warum wird dieses Objekt Catbasierend auf der Klasse erstellt Animal? Wird es nicht nur basierend auf seiner eigenen Klasse erstellt? Die Antwort ist ganz einfach, und vielleicht haben Sie sie bereits herausgefunden. 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 den Klassenkonstruktor behandelt . Hier ist ein Beispiel aus dieser Vorlesung:
public class Animal {

   String brain = „Der anfängliche Wert des Gehirns in der Tierklasse“;
   String heart = „Der Anfangswert des Herzens in der Tierklasse“;

   public static int animalCount = 7700000;

   public Animal(String brain, String heart) {
       System.out.println(„Der Konstruktor der Animal-Basisklasse wird ausgeführt“);
       System.out.println(„Wurden die Variablen der Animal-Klasse bereits initialisiert?“);
       System.out.println(„Der aktuelle Wert der statischen Variablen animalCount =“ + animalCount);
       System.out.println(„Aktueller Wert des Gehirns in der Klasse Tier =“ + this.brain);
       System.out.println(„Aktueller Wert des Herzens in der Klasse Tier =“ + this.heart);

       this.brain = brain;
       this.heart = heart;
       System.out.println(„Animal-Basisklassenkonstruktor abgeschlossen!“);
       System.out.println(„Aktueller Wert des Gehirns =“ + this.brain);
       System.out.println(„Aktueller Wert des Herzens =“ + this.heart);
   }
}

class Cat extends Animal {

   String tail = „Der Anfangswert von tail in der Cat-Klasse“;

   static int catsCount = 37;

   public Cat(String brain, String heart, String tail) {
       super(brain, heart);
       System.out.println(„Der Konstruktor der Cat-Klasse wurde gestartet (der Animal-Konstruktor wurde bereits ausgeführt)“);
       System.out.println(„Der aktuelle Wert der statischen Variablen catsCount =“ + catsCount);
       System.out.println(„Aktueller Wert tail =“ + this.tail);
       this.tail = tail;
       System.out.println(„Aktueller Wert tail =“ + this.tail);
   }

   public static void main(String[] args) {
       Cat cat = new Cat("Gehirn", "Herz", "Schwanz");
   }
}
Und wenn Sie es in der IDE ausführen, sieht die Konsolenausgabe so aus: Der Konstruktor der Basisklasse Animal läuft. 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 Der Konstruktor der Basisklasse Animal hat seine Arbeit abgeschlossen! Aktueller Wert von brain = Brain Aktueller Wert von heart = Heart Der Konstruktor der Cat-Klasse hat mit der Arbeit begonnen (der Animal-Konstruktor wurde bereits ausgeführt). Aktueller Wert der statischen Variablen catsCount = 37 Aktueller Wert von tail = Anfangswert von tail in der Katzenklasse Aktueller Wert von Schwanz = Schwanz Erinnerst du dich jetzt? :) Der Basisklassenkonstruktor, falls vorhanden, wird beim Erstellen eines Objekts immer zuerst aufgerufen. Instanceof folgt diesem Prinzip, wenn es versucht festzustellen, ob ein Objekt Аaus einer 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 Konstruktor MaineCoonwurde beim Erstellen nicht aufgerufen Cat, was logisch ist. Schließlich MaineCoonist er ein Nachkomme Cat, kein Vorfahre. Aber Cates ist keine Vorlage dafür. Ok, das scheint klar zu sein. Was passiert, wenn wir Folgendes 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 komplizierter. Versuchen wir zu argumentieren. Wir haben eine Variable vom Typ Catund haben ihr ein Objekt vom Typ zugewiesen MaineCoon. Übrigens, warum funktioniert das überhaupt? Ist das möglich? Dürfen. Schließlich ist jede Maine Coon eine Katze. Wenn es nicht ganz klar ist, erinnern Sie sich an das Beispiel mit primitiven Typerweiterungen:
public class Main {

   public static void main(String[] args) {

       long x = 1024;

   }
}
Die Zahl 1024 ist kurz : Sie passt problemlos in die lange Variable , da die Anzahl der Bytes dafür ausreicht (erinnern Sie sich an das Beispiel mit Nistpuppen?). Ein untergeordnetes Objekt kann immer einer Vorgängervariablen zugewiesen werden. Denken Sie zunächst daran, und in den nächsten Vorlesungen werden wir diesen Prozess weiter analysieren. Was wird unser Beispiel also bewirken?
Cat cat = new MaineCoon();
System.out.println(cat instanceof Cat);
System.out.println(cat instanceof MaineCoon);
Was prüft die Instanz: unsere Klassenvariable Catoder unser Klassenobjekt MaineCoon? Eigentlich ist die Antwort auf diese Frage einfach. Sie müssen nur noch einmal die Definition unseres Operators lesen: Der Operator „instanceof“ wird benötigt, um zu prüfen, ob das Objekt, auf das die Variable verweist, Xauf Basis einer Klasse erstellt wurde Y. Der Instanzoperator prüft den Ursprung eines Objekts, nicht einer Variablen. Daher wird im Beispiel in beiden Fällen in der Konsole true angezeigt : Wir haben ein Objekt vom Typ MaineCoon. Natürlich wurde es auf Basis der Klasse erstellt MaineCoon, aber auch auf Basis der übergeordneten Klasse Cat!
Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION