CodeGym /Java-blogg /Tilfeldig /Forekomst av og arv i Java
John Squirrels
Nivå
San Francisco

Forekomst av og arv i Java

Publisert i gruppen
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

Så, hva er arv? instanceof and Inheritance 101 - 1 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:
  • 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 Caroverordnet klasse, og bruk deretter nøkkelordet extends for å utlede alle klasser for spesifikke biltyper fra Carklassen.
Naturligvis er det andre alternativet mye mer 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 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, Carog 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å F1Carklassen, 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. instanceof and Inheritance 101 - 2

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 instanceofreturnerer true , siden vi har et Truckobjekt, og alle lastebiler er biler. Klassen Trucker avledet fra Carklassen. Alle lastebiler er laget basert på den felles forelderen, Carklassen. Se nøye på hvordan instanceofoperatø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 Truckklassen. Alle lastebiler er biler, men ikke alle biler er lastebiler. Carobjekter er ikke basert på Truckklassen. 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 instanceofbrukes oftest når equals()metoden overstyres. 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å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.
Kommentarer
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION