CodeGym /Java blog /Tilfældig /Forekomst af og arv i Java
John Squirrels
Niveau
San Francisco

Forekomst af og arv i Java

Udgivet i gruppen
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? instans af og arv 101 - 1 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 Caroverordnet klasse, og brug derefter nøgleordet udvider til at udlede alle klasser for bestemte typer biler fra Carklassen.
Naturligvis er den anden mulighed meget mere praktisk:

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, Carog 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 Carklassen. Men se på F1Carklassen, 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. instanceof and Inheritance 101 - 2

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 instanceofreturnerer sand , da vi har et Truckobjekt, og alle lastbiler er biler. Klassen Trucker afledt af Carklassen. Alle lastbiler er skabt ud fra den fælles forælder, Carklassen. Se nøje på, hvordan instanceofoperatø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 Truckklassen. Alle lastbiler er biler, men ikke alle biler er lastbiler. Carobjekter er ikke baseret på Truckklassen. 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 instanceofbruges mest, når equals()metoden tilsidesættes. For eksempel, her er, hvordan equalsmetoden implementeres i Stringklassen:

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 Stringmed 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.
Kommentarer
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION