Arv i Java forklaret

Arv

Java-arv refererer til en Java-klasses evne til inheritegenskaberne fra en anden klasse. Tænk på det som et barn, der arver egenskaber fra sine forældre, konceptet ligner det meget. I Java lingo kaldes det også udvidelse -ing en klasse.

Nogle enkle ting at huske:

  • Klassen, der udvider eller arver, kaldes en underklasse
  • Klassen, der udvides eller arves, kaldes en superklasse

Således giver arv Java den seje evne til at genbruge kode eller dele kode mellem klasser!

Lad os beskrive det med det klassiske eksempel på en Vehicleklasse og en Carklasse:

public class Vehicle { public void start() { // starting the engine } public void stop() { // stopping the engine } } public class Car extends Vehicle { int numberOfSeats = 4; public int getNumberOfSeats() { return numberOfSeats; } }

Her kan vi se Carklassen arve klassenes egenskaber Vehicle. Så behøver vi ikke at skrive den samme kode til de metoder, start()og stop()for Carså godt, som de egenskaber er tilgængelige fra dets forælder eller superklassen. Derfor vil objekter oprettet fra Carklassen også have disse egenskaber!

Car tesla = new Car(); tesla.start(); tesla.stop();

Kør kode

Men har forældreklassen barnets metoder? Nej, det gør det ikke.

Derfor, når du har brug for at dele et almindeligt stykke kode mellem flere klasser, er det altid godt at have en overordnet klasse og derefter udvide denne klasse, når det er nødvendigt! Reducerer antallet af kodelinjer, gør koden modulær og forenkler testningen.

Hvad kan nedarves?

  • Alle protectedog publicfelter og metoder fra forælder

Hvad kan ikke arves?

  • private felter og metoder
  • Konstruktører. Selv om underklasse konstruktør har at kalde superklasse konstruktøren, hvis den definerede (Mere om det senere!)
  • Flere klasser. Java understøtter kun en enkelt arv , det vil sige, du kan kun arve en klasse ad gangen.
  • Felter. Individuelle felter i en klasse kan ikke tilsidesættes af underklassen.

Type Casting & Reference

I Java er det muligt at henvise til en underklasse som en forekomst af dens superklasse. Det kaldes polymorfisme i objektorienteret programmering (OOP), evnen for et objekt til at tage mange former. For eksempel Carkan klasseobjektet henvises til som en Vehicleklasseinstans som denne:

Vehicle car = new Car();

Selvom det modsatte ikke er muligt:

Car car = new Vehicle(); // ERROR

Kør kode

Da du kan henvise til en Java-underklasse som en superklasse-forekomst, kan du nemt caste en forekomst af et underklasseobjekt til en superklasse-forekomst. Det er muligt at kaste et superklasseobjekt i en underklassetype, men kun hvis objektet virkelig er en forekomst af underklassen . Så husk dette:

Car car = new Car(); Vehicle vehicle = car; // upcasting Car car2 = (Car)vechile; //downcasting Bike bike = new Bike(); // say Bike is also a subclass of Vehicle Vehicle v = bike; // upcasting, no problem here. Car car3 = (Car)bike; // Compilation Error : as bike is NOT a instance of Car

Kør kode

Nu ved du, hvordan du deler kode gennem et forhold mellem forældre og barn. Men hvad hvis du ikke kan lide implementeringen af ​​en bestemt metode i barneklassen og vil skrive en ny til den? Hvad gør man så?

Tilsidesæt det!

Java giver dig mulighed for at tilsidesætte eller omdefinere de metoder, der er defineret i superklassen. For eksempel har din Carklasse en anden implementering start()end forælderen Vehicle, så du gør dette:

public class Vehicle { public void start() { System.out.println("Vehicle start code"); } } public class Car extends Vehicle { public void start() { System.out.println("Car start code"); } } Car car = new Car(); car.start(); // "Car start code"

Kør kode

Så det er ret simpelt at tilsidesætte metoder i underklassen. Selvom der er en fangst . Kun den superklassemetode med nøjagtig den samme metodesignatur som subklassemetoden bliver tilsidesat. Det betyder, at definitionen af ​​underklassemetoden skal have nøjagtigt samme navn, samme antal og type parametre og i nøjagtig samme rækkefølge. Således public void start(String key)ville ikke tilsidesætte public void start().

Bemærkninger :

  • Du kan ikke tilsidesætte superklassens private metoder. (Helt oplagt, er det ikke?)
  • Hvad hvis metoden til superklasse, som du tilsidesætter i underklassen, pludselig bliver udslettet eller metoder ændres? Det ville mislykkes i løbetid! Så Java giver dig en smidig kommentar, @Overridesom du kan placere over subklassemetoden, som vil advare kompilatoren for disse hændelser!

Kommentarer i Java er en god kodningspraksis, men de er ikke en nødvendighed. Compileren er dog smart nok til at finde ud af, at den tilsidesætter. I modsætning til andre OOP-sprog ændrer kommentarerne i Java det ikke nødvendigvis metoden eller tilføjer ekstra funktionalitet.

Hvordan man kalder superklassemetoder?

Sjovt du spørger om det! Brug bare nøgleordet super:

public class Vehicle() { public void start() { System.out.println("Vehicle start code"); } } public class Car extends Vehicle { public void run() { super.start(); } } Car car = new Car(); car.run(); // "Vehicle start code"

Kør kode

NB : Selvom du kan ringe til den overordnede metode ved hjælp af etsuperopkald, kan du ikke gå op i arvshierarkiet med kædedesuperopkald.

Hvordan ved jeg typen af ​​en klasse?

Using the instanceof keyword. Having lots of classes and subclasses it would be a little confusing to know which class is a subclass of which one in runtime. So, we can use instanceof to determine whether an object is an instance of a class, an instance of a subclass, or an instance of an interface.

Car car = new Car(); boolean flag = car instanceof Vehicle; // true in this case!

Constructors & Inheritance

As mentioned earlier, constructors cannot be directly inherited by a subclass. Although, a subclass is required to call its parent’s constructor as the first operation in its own constructor. How? You guessed it, using super :

public class Vehicle { public Vehicle() { // constructor } public void start() { System.out.println("Vehicle start code"); } } public class Car extends Vehicle { public Car() { super(); } public void run() { super.start(); } }

Run Code

Husk, at hvis superklassen ikke har nogen konstruktører defineret, behøver du ikke kalde det eksplicit i underklassen. Java håndterer det internt for dig! Påkaldelse til superkonstruktør sker i tilfælde af, at superklassen skal kaldes sammen med en hvilken som helst anden konstruktør end standardkonstruktøren .

Hvis der ikke er defineret andre konstruktører, påberåber Java standard superklassekonstruktøren ( selvom den ikke er defineret eksplicit ).

Tillykke, nu ved du alt om arv! Læs mere om avancerede måder at arve ting på i abstrakte klasser og grænseflader!