Hei! I tidligere leksjoner har vi allerede kort blitt kjent med begrepet arv. I dag skal vi berøre dette emnet igjen, men igjen ikke for dypt. Vi kommer fortsatt til å ha en mer detaljert leksjon om dette i fremtiden. I dag skal vi bare ta en rask titt på noen få praktiske eksempler og bli kjent med en interessant operatør i Java.
Arv er en programmeringsmekanisme (inkludert i Java) som lar deg erklære en ny klasse basert på en eksisterende. Den avledede klassen får deretter tilgang til feltene og metodene til den overordnede klassen. Hvorfor skulle vi trenge dette? Vel, forestill deg at du må lage flere bilklasser i et program: Truck, RaceCar, Sedan, Pickup, osv. Allerede før du skriver noen kode, vet du sikkert at alle disse klassene har mye til felles: alle biler har en modell navn, produksjonsår, motorstørrelse, maksimalt turtall osv. (for ikke å snakke om at de alle har hjul og andre deler til felles). I denne situasjonen kan du:
Arv
Så, hva er arv?
- Opprett disse feltene i hver klasse (legg dem til i hver nye bilklasse etter hvert som du oppretter den)
- Ta med feltene som er felles for alle biler i en
Car
overordnet klasse, og bruk deretter nøkkelordet extends for å utlede alle klasser for spesifikke biltyper 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 et minimum unngår vi unødvendig duplisering av kode (og det bør vi alltid strebe etter når vi skriver programmer). I tillegg har vi en enkel og forståelig klassestruktur, med alle felt som er felles for alle biler samlet i én klasse. Hvis lastebiler har noen spesialfelt som andre biler ikke har, kan de oppgis i klassen Truck
. Det samme gjelder metoder. Alle biler har en viss felles oppførsel som kan beskrives med metoder, f.eks. starte bilen, akselerere/bremse osv. Disse vanlige metodene kan konsolideres inn i foreldreklassen, Car
og hver spesifikke biltype kan definere sine unike handlinger i sine avledede 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 la til klassen metodene som er felles for alle biler Car
. Men, se på F1Car
klassen, som representerer "Formel 1" racerbiler. Pit-stopp (stopp for akutt bilvedlikehold) gjøres kun i løp, så vi har lagt til denne spesifikke funksjonaliteten til den relevante avledede klassen. 
forekomst av operatør
I Java er det en spesiell operatør, instanceof , for å sjekke om et objekt ble opprettet basert på en bestemt klasse. Det returnerer sant eller usant avhengig av resultatet av sjekken. La oss se hvordan det fungerer ved å bruke klassene i bileksemplet vårt:
public class Truck extends Car {
public static void main(String[] args) {
Truck truck = new Truck();
System.out.println(truck instanceof Car);
}
}
Output: true Operatøren instanceof
returnerer true , siden vi har et Truck
objekt, og alle lastebiler er biler. Klassen Truck
er avledet fra Car
klassen. Alle lastebiler er laget basert på den felles forelderen, Car
klassen. Se nøye på hvordan instanceof
operatøren brukes. Du skriver det uten punktum, siden det er en operator, ikke en metode ("objektforekomst av klasse"). La oss prøve en annen måte:
public static void main(String[] args) {
Car car = new Car();
System.out.println(car instanceof Truck);
}
Output: false Klassen Car
(og bilobjektene) stammer ikke fra Truck
klassen. Alle lastebiler er biler, men ikke alle biler er lastebiler. Car
objekter er ikke basert på Truck
klassen. Et eksempel til:
public static void main(String[] args) {
Car car = new Car();
Truck truck = new Truck();
System.out.println(car instanceof Object && truck instanceof Object);
}
Utdata: Sant Her er logikken enkel også: alle klasser i Java, inkludert klasser du oppretter, kommer fra klassen Object
(selv om du ikke skriver "extends Object" - det er allerede underforstått). Hvordan og når vil dette være nyttig? Operatøren instanceof
brukes oftest når equals()
metoden overstyres. 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åtte objektet, tester metoden for å se om objektet til og med er en streng? Først da begynner den å sammenligne egenskapene til de to objektene. Hvis denne testen ikke fantes, kunne ethvert objekt med verdi- og lengdefelt sendes til metoden og sammenlignes med en streng, noe som selvfølgelig ville være feil.
GO TO FULL VERSION