Hej! I tidligere lektioner har vi allerede kort stiftet bekendtskab med begrebet arv. I dag vil vi berøre dette emne igen, men igen ikke for dybt. Vi vil stadig have en mere detaljeret lektion om dette i fremtiden. I dag vil vi lige tage et hurtigt kig på et par praktiske eksempler og stifte bekendtskab med en interessant operatør i Java.
Arv
Så hvad er arv? Arv er en programmeringsmekanisme (inklusive i Java), som lader dig erklære en ny klasse baseret på en eksisterende. Den afledte klasse får derefter adgang til felterne og metoderne for den overordnede klasse. Hvorfor skulle vi have brug for dette? Tja, forestil dig, at du skal oprette flere bilklasser i et program: Lastbil, RaceCar, Sedan, Pickup osv. Allerede før du skriver en kode, ved du med sikkerhed, at alle disse klasser har meget til fælles: alle biler har en model navn, fabrikationsår, motorstørrelse, maksimalt omdrejningstal osv. (for ikke at nævne, at de alle har hjul og andre dele tilfælles). I denne situation kan du:- Opret disse felter i hver klasse (tilføj dem til hver ny bilklasse, efterhånden som du opretter den)
- Bring de felter, der er fælles for alle biler, ind i en
Car
overordnet klasse, og brug derefter nøgleordet udvider til at udlede alle klasser for bestemte typer biler fraCar
klassen.
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);
}
}
Som minimum undgår vi unødvendig duplikering af kode (og det bør vi altid stræbe efter, når vi skriver programmer). Derudover har vi en enkel og forståelig klassestruktur, hvor alle felter, der er fælles for alle biler, er samlet i én klasse. Hvis lastbiler har særlige felter, som andre biler ikke har, kan de oplyses i klassen Truck
. Det samme gælder metoder. Alle biler har en bestemt fælles adfærd, der kan beskrives med metoder, fx start bilen, accelerer/bremse osv. Disse almindelige metoder kan konsolideres i moderklassen, Car
og hver specifik type bil kan definere sine unikke handlinger i deres afledte klasser .
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();
}
}
Vi tilføjede de metoder, der er fælles for alle biler, til Car
klassen. Men se på F1Car
klassen, som repræsenterer "Formel 1" racerbiler. Pitstop (stop for akut bilvedligeholdelse) udføres kun i løb, så vi tilføjede denne specifikke funktionalitet til den relevante afledte klasse.
forekomst af operatør
I Java er der en speciel operator, instanceof , til at kontrollere, om et objekt blev oprettet baseret på en bestemt klasse. Det returnerer sandt eller falsk afhængigt af resultatet af kontrollen. Lad os se, hvordan det fungerer ved at bruge klasserne i vores bileksempel:
public class Truck extends Car {
public static void main(String[] args) {
Truck truck = new Truck();
System.out.println(truck instanceof Car);
}
}
Output: sand Operatøren instanceof
returnerer sand , da vi har et Truck
objekt, og alle lastbiler er biler. Klassen Truck
er afledt af Car
klassen. Alle lastbiler er skabt ud fra den fælles forælder, Car
klassen. Se nøje på, hvordan instanceof
operatøren bruges. Du skriver det uden punktum, da det er en operator, ikke en metode ("objektforekomst af klasse"). Lad os prøve en anden måde:
public static void main(String[] args) {
Car car = new Car();
System.out.println(car instanceof Truck);
}
Output: false Klassen Car
(og bilobjekter) stammer ikke fra Truck
klassen. Alle lastbiler er biler, men ikke alle biler er lastbiler. Car
objekter er ikke baseret på Truck
klassen. Endnu et eksempel:
public static void main(String[] args) {
Car car = new Car();
Truck truck = new Truck();
System.out.println(car instanceof Object && truck instanceof Object);
}
Output: Sandt Her er logikken også enkel: alle klasser i Java, inklusive klasser du opretter, stammer fra klassen Object
(selvom du ikke skriver "extends Object" - det er allerede underforstået). Hvordan og hvornår ville dette være nyttigt? Operatøren instanceof
bruges mest, når equals()
metoden tilsidesættes. For eksempel, her er, hvordan equals
metoden implementeres i String
klassen:
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;
}
Før man sammenligner a String
med det beståede objekt, tester metoden for at se, om objektet overhovedet er en streng? Først derefter begynder den at sammenligne de to objekters egenskaber. Hvis denne test ikke eksisterede, kunne ethvert objekt med værdi- og længdefelter overføres til metoden og sammenlignes med en streng, hvilket naturligvis ville være forkert.
GO TO FULL VERSION