CodeGym /Java-Blog /Random-DE /Instanz und Vererbung in Java
Autor
Aditi Nawghare
Software Engineer at Siemens

Instanz und Vererbung in Java

Veröffentlicht in der Gruppe Random-DE
Hallo! In den vorherigen Lektionen haben wir uns bereits kurz mit dem Konzept der Vererbung vertraut gemacht. Heute werden wir dieses Thema noch einmal ansprechen, aber auch hier nicht zu tief. Wir werden hierzu in Zukunft noch eine ausführlichere Lektion erhalten. Heute werfen wir einfach einen kurzen Blick auf ein paar praktische Beispiele und lernen einen interessanten Operator in Java kennen.

Nachlass

Was ist also Vererbung? Instanz von und Vererbung 101 - 1Vererbung ist ein Programmiermechanismus (auch in Java), mit dem Sie eine neue Klasse basierend auf einer vorhandenen Klasse deklarieren können. Die abgeleitete Klasse erhält dann Zugriff auf die Felder und Methoden der übergeordneten Klasse. Warum sollten wir das brauchen? Stellen Sie sich vor, Sie müssten in einem Programm mehrere Autoklassen erstellen: Truck, RaceCar, Sedan, Pickup usw. Noch bevor Sie Code schreiben, wissen Sie sicher, dass alle diese Klassen viel gemeinsam haben: Alle Autos haben ein Modell Name, Baujahr, Motorgröße, Höchstgeschwindigkeit usw. (ganz zu schweigen von der Tatsache, dass sie alle Räder und andere Teile gemeinsam haben). In dieser Situation können Sie:
  • Erstellen Sie diese Felder in jeder Klasse (fügen Sie sie beim Erstellen jeder neuen Fahrzeugklasse hinzu).
  • Bringen Sie die allen Autos gemeinsamen Felder in eine Car übergeordnete Klasse und verwenden Sie dann das Schlüsselwort „ extends“ , um alle Klassen für bestimmte Autotypen aus der Car Klasse abzuleiten.
Wesentlich bequemer ist natürlich die zweite Möglichkeit:

public class Car {

   private String model;
   private int maxSpeed;
   private int yearOfManufacture;

   public Car(String model, int maxSpeed, int yearOfManufacture) {
       this.model = model;
       this.maxSpeed = maxSpeed;
       this.yearOfManufacture = yearOfManufacture;
   }
}

public class Truck extends Car {

   public Truck(String model, int maxSpeed, int yearOfManufacture) {
       super(model, maxSpeed, yearOfManufacture);
   }
}

public class Sedan extends Car {
   public Sedan(String model, int maxSpeed, int yearOfManufacture) {
       super(model, maxSpeed, yearOfManufacture);
   }
}
Zumindest vermeiden wir die unnötige Duplizierung von Code (und das sollten wir beim Schreiben von Programmen immer anstreben). Darüber hinaus verfügen wir über eine einfache und verständliche Klassenstruktur, bei der alle Felder, die allen Fahrzeugen gemeinsam sind, in einer Klasse zusammengefasst sind. Wenn LKWs spezielle Felder haben, die andere Autos nicht haben, können sie in der TruckKlasse deklariert werden. Das Gleiche gilt für Methoden. Alle Autos haben bestimmte gemeinsame Verhaltensweisen, die mit Methoden beschrieben werden können, z. B. Starten des Autos, Beschleunigen/Bremsen usw. Diese gemeinsamen Methoden können in der übergeordneten Klasse konsolidiert werden, Carund jeder spezifische Autotyp kann seine einzigartigen Aktionen in seinen abgeleiteten Klassen definieren .

public class Car {

   public void gas() {
       // Accelerate
   }

   public void brake() {
       // Brake
   }
}


public class F1Car extends Car {

   public void pitStop() {
      
       // Only race cars make pit stops
   }

   public static void main(String[] args) {
      
       F1Car formula1Car = new F1Car();
       formula1Car.gas();
       formula1Car.pitStop();
       formula1Car.brake();
   }
}
Wir haben der Klasse die Methoden hinzugefügt, die allen Autos gemeinsam sind Car. Aber schauen Sie sich die F1CarKlasse an, die „Formel-1“-Rennwagen repräsentiert. Boxenstopps (Stopps für dringende Fahrzeugwartungen) werden nur bei Rennen durchgeführt, daher haben wir diese spezifische Funktionalität der entsprechenden abgeleiteten Klasse hinzugefügt. Instanz von und Vererbung 101 - 2

Instanz des Operators

In Java gibt es einen speziellen Operator, instanceof , mit dem überprüft werden kann, ob ein Objekt basierend auf einer bestimmten Klasse erstellt wurde. Abhängig vom Ergebnis der Prüfung wird true oder false zurückgegeben. Sehen wir uns anhand der Klassen in unserem Autobeispiel an, wie es funktioniert:

public class Truck extends Car {

   public static void main(String[] args) {

       Truck truck = new Truck();
       System.out.println(truck instanceof Car);
   }
}
Ausgabe: true Der instanceofOperator gibt true zurück , da wir ein TruckObjekt haben und alle Lastwagen Autos sind. Die TruckKlasse wird von der Klasse abgeleitet Car. Alle LKWs werden auf Basis des gemeinsamen übergeordneten Elements, der CarKlasse, erstellt. Schauen Sie sich genau an, wie der instanceofOperator verwendet wird. Sie schreiben es ohne Punkt, da es sich um einen Operator und nicht um eine Methode („Objektinstanz der Klasse“) handelt. Versuchen wir es anders:

public static void main(String[] args) {

   Car car = new Car();
   System.out.println(car instanceof Truck);
}
Ausgabe: false Die CarKlasse (und die Autoobjekte) werden nicht von der TruckKlasse abgeleitet. Alle Lastwagen sind Autos, aber nicht alle Autos sind Lastwagen. CarObjekte basieren nicht auf der TruckKlasse. Noch ein Beispiel:

public static void main(String[] args) {

   Car car = new Car();
   Truck truck = new Truck();
   System.out.println(car instanceof Object && truck instanceof Object);
}
Ausgabe: True Auch hier ist die Logik einfach: Alle Klassen in Java, einschließlich der von Ihnen erstellten Klassen, stammen von der ObjectKlasse ab (auch wenn Sie nicht „extends Object“ schreiben – es ist bereits impliziert). Wie und wann wäre das sinnvoll? Der instanceofOperator wird am häufigsten zum Überschreiben der equals()Methode verwendet. So wird die Methode beispielsweise in der Klasse equals implementiert :String

public boolean equals(Object anObject) {
   if (this == anObject) {
       return true;
   }
   if (anObject instanceof String) {
       String anotherString = (String) anObject;
       int n = value.length;
       if (n == anotherString.value.length) {
           char v1[] = value;
           char v2[] = anotherString.value;
           int i = 0;
           while (n-- != 0) {
               if (v1[i] != v2[i])
                       return false;
               i++;
           }
           return true;
       }
   }
   return false;
}
Vor dem Vergleich von a String mit dem übergebenen Objekt prüft die Methode, ob das Objekt überhaupt ein String ist? Erst dann beginnt der Vergleich der Eigenschaften der beiden Objekte. Wenn es diesen Test nicht gäbe, könnte jedes Objekt mit Wert und Längenfeldern an die Methode übergeben und mit einem String verglichen werden, was natürlich falsch wäre.
Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION