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.
Vererbung 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:
![Instanz von und Vererbung 101 - 2]()
Nachlass
Was ist also Vererbung?
- 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 derCar
Klasse abzuleiten.
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 Truck
Klasse 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, Car
und 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 F1Car
Klasse 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 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 instanceof
Operator gibt true zurück , da wir ein Truck
Objekt haben und alle Lastwagen Autos sind. Die Truck
Klasse wird von der Klasse abgeleitet Car
. Alle LKWs werden auf Basis des gemeinsamen übergeordneten Elements, der Car
Klasse, erstellt.
Schauen Sie sich genau an, wie der instanceof
Operator 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 Car
Klasse (und die Autoobjekte) werden nicht von der Truck
Klasse abgeleitet. Alle Lastwagen sind Autos, aber nicht alle Autos sind Lastwagen. Car
Objekte basieren nicht auf der Truck
Klasse.
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 Object
Klasse ab (auch wenn Sie nicht „extends Object“ schreiben – es ist bereits impliziert).
Wie und wann wäre das sinnvoll?
Der instanceof
Operator 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.
GO TO FULL VERSION