Ebben az oktatóanyagban példák segítségével megismerhetjük a Java szuper kulcsszavát.
A super
Java kulcsszót az alosztályokban használják a szuperosztály tagjai (attribútumok, konstruktorok és módszerek) elérésére.
Mielőtt megtudnánk a super
kulcsszót, feltétlenül ismerje meg a Java öröklődését.
A szuper kulcsszó használata
- Az alosztályban felülírt szuperosztály metódusainak meghívása.
- A szuperosztály attribútumaihoz (mezõihez) való hozzáférés, ha mind a szuperosztály, mind az alosztály azonos névvel rendelkeznek.
- A szuperosztályú no-arg (alapértelmezett) vagy paraméterezett konstruktor kifejezett megnevezése az alosztály konstruktorából.
Értsük meg ezeket a felhasználásokat.
1. Hozzáférés a szuperosztály felülbírált módszereihez
Ha az azonos nevű módszereket mind a szuperosztályban, mind az alosztályban definiálják, az alosztályban szereplő módszer felülírja a szuperkategória módszerét. Ezt nevezzük metódus felülbírálásnak.
1. példa: A módszer felülbírálása
class Animal ( // overridden method public void display()( System.out.println("I am an animal"); ) ) class Dog extends Animal ( // overriding method @Override public void display()( System.out.println("I am a dog"); ) public void printMessage()( display(); ) ) class Main ( public static void main(String() args) ( Dog dog1 = new Dog(); dog1.printMessage(); ) )
Kimenet
egy kutya vagyok
Ebben a példában a Dog osztály objektum dog1 létrehozásával a metódust printMessage () -nek hívhatjuk, amely aztán végrehajtja az display()
utasítást.
Mivel display()
mindkét osztályban meg van határozva, a Dog alosztály módszere felülírja az Animal szuperosztályú módszert. Ezért display()
az alosztályt hívjuk.
Mi van, ha a szuperosztály felülbírált módszerét kell meghívni?
Akkor használjuk, super.display()
ha display()
meg kell hívni az Animal szuperkategória felülbírált módszerét .
2. példa: szuper a Call Superclass módszer
class Animal ( // overridden method public void display()( System.out.println("I am an animal"); ) ) class Dog extends Animal ( // overriding method @Override public void display()( System.out.println("I am a dog"); ) public void printMessage()( // this calls overriding method display(); // this calls overridden method super.display(); ) ) class Main ( public static void main(String() args) ( Dog dog1 = new Dog(); dog1.printMessage(); ) )
Kimenet
Kutya vagyok, állat vagyok
Itt van, hogyan működik a fenti program.
2. Hozzáférés a szuperosztály attribútumaihoz
A szuperosztálynak és az alosztálynak lehetnek azonos nevű attribútumai. A super
kulcsszót használjuk a szuperosztály attribútumának eléréséhez.
3. példa: Hozzáférés a superclass attribútumhoz
class Animal ( protected String; ) class Dog extends Animal ( public String; public void printType() ( System.out.println("I am a " + type); System.out.println("I am an " + super.type); ) ) class Main ( public static void main(String() args) ( Dog dog1 = new Dog(); dog1.printType(); ) )
Kimenet :
Emlős vagyok állat vagyok
Ebben a példában ugyanazt a példánymezőtípust definiáltuk az Animal szuperosztályban és a Dog alosztályban egyaránt.
Ezután létrehoztunk egy objektum dog1-et a Dog osztályból. Ezután a printType()
metódust ennek az objektumnak a felhasználásával hívják meg.
A printType()
funkcióban,
- típus a Kutya alosztály attribútumára utal.
- A super.type az Állat szuperosztály tulajdonságára utal.
Ezért System.out.println("I am a " + type);
nyomatok emlős vagyok. És, System.out.println("I am an " + super.type);
nyomatok, állat vagyok.
3. A super () használata a szuperosztály konstruktor eléréséhez
Mint tudjuk, egy osztály objektumának létrehozásakor automatikusan meghívják az alapértelmezett konstruktort.
Ahhoz, hogy kifejezetten felhívjuk a szuperosztályú konstruktort az alosztály konstruktorából, használjuk super()
. A super
kulcsszó speciális formája .
super()
csak az alosztály konstruktorán belül használható, és az első utasításnak kell lennie.
4. példa: A super () használata
class Animal ( // default or no-arg constructor of class Animal Animal() ( System.out.println("I am an animal"); ) ) class Dog extends Animal ( // default or no-arg constructor of class Dog Dog() ( // calling default constructor of the superclass super(); System.out.println("I am a dog"); ) ) class Main ( public static void main(String() args) ( Dog dog1 = new Dog(); ) )
Kimenet
Állat vagyok kutya vagyok
Itt, amikor a Dog osztály objektum dog1 létrehozásra kerül, automatikusan felhívja az adott osztály alapértelmezett vagy argum nélküli konstruktorát.
Az alosztály konstruktorán belül az super()
utasítás felhívja a szuperosztály konstruktorát, és végrehajtja a benne lévő utasításokat. Ezért megkapjuk azt a kimenetet, hogy állat vagyok.
Ezután a program folyamata visszatér az alosztály konstruktorához, és végrehajtja a fennmaradó utasításokat. Így vagyok kutya kinyomtatásra kerül.
Használata super()
azonban nem kötelező. Még akkor is, ha super()
az alosztály konstruktorában nem használják, a fordító implicit módon a szuperosztály alapértelmezett konstruktorát hívja meg.
Miért érdemes tehát redundáns kódot használni, ha a fordító automatikusan meghívja a super () -t?
Szükség van rá, ha az alosztály konstruktorából meg kell hívni a szuperosztály paraméterezett konstruktorát (egy konstruktort, amely argumentumokat vesz fel) .
A paraméterezettnek super()
mindig az alosztály konstruktorának törzsében kell lennie az első utasításnak, különben fordítási hibát kapunk.
5. példa: Paraméterezett konstruktor hívása a super () használatával
class Animal ( // default or no-arg constructor Animal() ( System.out.println("I am an animal"); ) // parameterized constructor Animal(String type) ( System.out.println("Type: "+type); ) ) class Dog extends Animal ( // default constructor Dog() ( // calling parameterized constructor of the superclass super("Animal"); System.out.println("I am a dog"); ) ) class Main ( public static void main(String() args) ( Dog dog1 = new Dog(); ) )
Kimenet
Típus: Állat Kutya vagyok
A fordító automatikusan felhívhatja a no-arg konstruktort. Paraméterezett konstruktorokat azonban nem hívhat meg.
Ha paraméterezett konstruktort kell meghívni, akkor azt kifejezetten meg kell határoznunk az alosztály konstruktorában.
Vegye figyelembe, hogy a fenti példában kifejezetten a paraméterezett konstruktort hívtuk meg super("Animal")
. A fordító ebben az esetben nem hívja meg a szuperosztály alapértelmezett konstruktorát.