Az öröklés Java-ban magyarázva

Öröklés

A Java öröklés a Java osztály azon képességére utal, inheritamely valamilyen más osztály tulajdonságaihoz igazodik. Gondoljon rá úgy, mintha egy gyermek örökölné a szüleitől a tulajdonságokat, a koncepció nagyon hasonló ehhez. A Java nyelvhasználatban osztály kiterjesztésének is nevezik .

Néhány egyszerű dolog, amire emlékezni kell:

  • A kiterjedő vagy öröklődő osztályt alosztálynak nevezzük
  • A kiterjesztett vagy öröklődő osztályt szuperosztálynak nevezzük

Így az öröklés megadja a Java számára azt a jó képességet, hogy újra felhasználja a kódot, vagy megossza a kódot az osztályok között!

Írjuk le egy Vehicleosztály és egy Carosztály klasszikus példájával :

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; } }

Itt láthatjuk, hogy az Carosztály örökli az osztály tulajdonságait Vehicle. Tehát nem kell írni ugyanazt a kódot az eljárások start()és stop()az Caris, ahogyan ezek a tulajdonságok elérhető a szülő vagy mikrotörzs. Ezért az Carosztályból létrehozott objektumok is megvannak ezek a tulajdonságok!

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

Futtassa a kódot

De vajon a szülő osztály rendelkezik-e a gyermek módszereivel? Nem, nem.

Ezért, amikor valamilyen közös kódrészletet kell megosztania több osztály között, mindig jó, ha van szülőosztálya, majd szükség esetén bővítse azt! Csökkenti a kódsorok számát, modulokká teszi a kódot és egyszerűbbé teszi a tesztelést.

Mi örökölhető?

  • Minden protectedés publicmezők és módszerek a szülő

Mi nem örökölhető?

  • private mezők és módszerek
  • Kivitelezők. Bár az alosztály konstruktorának meg kell hívnia a szuperosztály konstruktort, ha meg van határozva (Bővebben erről később!)
  • Több osztály. A Java csak egyetlen öröklést támogat , vagyis egyszerre csak egy osztályt örökölhet.
  • Mezők. Az osztály egyes mezőit az alosztály nem írhatja felül.

Típus Casting & Reference

A Java-ban lehetséges egy alosztályra hivatkozni, mint annak szuperosztályának példánya . Polimorfizmusnak nevezik az objektumorientált programozásban (OOP), egy objektum azon képességének, hogy sokféle formát öltsön. Például az Carclass objektumra így hivatkozhatunk Vehicleosztálypéldányként:

Vehicle car = new Car();

Bár ennek az ellenkezője nem lehetséges:

Car car = new Vehicle(); // ERROR

Futtassa a kódot

Mivel a Java alosztályra szuperosztályos példányként hivatkozhat, könnyen átküldheti egy alosztály objektumának példányát egy szuperosztály osztályra. Szuperosztályú objektumokat alosztálytípusba lehet önteni, de csak akkor, ha az objektum valóban az alosztály példánya . Tehát ne feledje ezt:

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

Futtassa a kódot

Most már tudja, hogyan kell megosztani a kódot a szülő-gyermek kapcsolat révén. De mi van, ha nem tetszik egy adott módszer megvalósítása a gyermekosztályban, és újat szeretne írni hozzá? Mit csinálsz akkor?

Írja felül!

A Java segítségével felülírhatja vagy újradefiniálhatja a szuperosztályban meghatározott módszereket. Például az Carosztályod megvalósítása start()eltér a szülőtől Vehicle, ezért ezt tedd:

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"

Futtassa a kódot

Tehát nagyon egyszerű felülírni a módszereket az alosztályban. Bár van egy fogás . Csak azt a szuperosztályos metódust írja felül, amely pontosan ugyanazzal a metódus-aláírással rendelkezik, mint az alosztály-metódus. Ez azt jelenti, hogy az alosztály metódusának pontosan ugyanazzal a névvel, azonos számú és típusú paraméterrel kell rendelkeznie, és pontosan ugyanabban a sorrendben. Így public void start(String key)nem írná felül public void start().

Megjegyzések :

  • Nem lehet felülírni a szuperosztály privát módszereit. (Egészen nyilvánvaló, nem?)
  • Mi van, ha az alosztályban felülírt szuperosztály módszere hirtelen elpusztul, vagy a módszerek megváltoznak? Futás közben kudarcot vallana! Tehát a Java egy remek kommentárral látja el, @Overrideamelyet elhelyezhet az alosztály metódus felett, amely figyelmezteti a fordítót ezekre az eseményekre!

A Java kommentárjai jó kódolási gyakorlat, de nem szükségszerűek. A fordító elég okos ahhoz, hogy rájöjjön, felülírja-e önmagát. Más OOP nyelvektől eltérően, a Jegyzetek a Java-ban nem feltétlenül módosítja a módszert, és nem ad hozzá további funkciókat.

Hogyan lehet szuper osztályú módszereket hívni?

Vicces, hogy kérdezel róla! Csak használja a következő kulcsszót 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"

Futtassa a kódot

Megjegyzés : Bár hívhatja a szülő metódustsuperhíváshasználatával, láncoltsuperhívásokkalnem léphet fel az öröklési hierarchiába.

Hogyan lehet megismerni az osztály típusát?

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

Remember, if the superclass does not have any constructors defined, you don’t have to call it explicitely in the subclass. Java handles that internally for you! Invocation to super constructor is done in the case when the super class is to be called with any other constructor other than the default constructor.

If no other constructors are defined, then Java invokes the default super class constructor (even if not defined explicitly).

Congrats, now you know all about Inheritance! Read more about advanced ways to inherit things in Abstract Classes and Interfaces!