Jelenlegi hely

12.3. A super használata

Ha egy metódus felülírja az ősosztálya metódusainak egyikét, akkor a super használatával segítségül hívható a felülírt metódus. A super arra is használható, hogy egy rejtett tag variánsra utaljunk. Ez a szülőosztály:

public class Superclass {
    public boolean aVariable;
    public void aMethod() {
        aVariable = true;
    }
}

Most következzen a Subclass nevű leszármazott osztály, mely felülírja aMethod-ot és aVariable-t:

public class Subclass extends Superclass {
    public boolean aVariable; //hides aVariable in Superclass
    public void aMethod() { //overrides aMethod in Superclass
        aVariable = false;
        super.aMethod();
        System.out.println(aVariable);
        System.out.println(super.aVariable);
    }
}

A leszármazott osztályon belül az aVariable név a SubClass-ban deklaráltra utalt, amely a szülőosztályban deklaráltat elrejti. Hasonlóképpen, az aMethod név a SubClass-ban deklaráltra utalt, amely felsőbb osztályban deklaráltat felülírja. Tehát ha egy a szülőosztályból örökölt aVariable-ra és aMethod-ra szeretnénk utalni, a leszármazott osztálynak egy minősített nevet kell használnia, használva a super-t, mint azt láttuk. A Subclass aMethod metódusa a következőket írja ki:

false
true

Használhatjuk a super-t a konstruktoron belül is az ősosztály konstruktora meghívására. A következő kódpélda bemutatja a Thread osztály egy részét – az osztály lényegében többszálú programfutást tesz lehetővé –, amely végrehajt egy animációt. Az AnimationThread osztály konstruktora beállít néhány kezdeti értékeket, ilyenek például a keretsebesség és a képek száma, majd a végén letölti a képeket:

class AnimationThread extends Thread {
    int framesPerSecond;
    int numImages;
    Image[] images;
    AnimationThread(int fps, int num) {
        super("AnimationThread");
        this.framesPerSecond = fps;
        this.numImages = num;
        this.images = new Image[numImages];
        for (int i = 0; i <= numImages; i++) {
            ...
            // Load all the images.
            ...
        }
    }
    ...
}

A félkövérrel szedett sor a közvetlen szülőosztály konstruktorának explicit meghívása, melyet a Thread nyújt. Ez a Thread konstruktor átvesz egy String-et, és így nevezi a Thread-et. Ha a leszármazott osztály konstruktorában van explicit super konstruktorhívás, akkor annak az elsőnek kell lennie. Ha egy konstruktor nem hív meg explicit módon egy szülőosztálybeli konstruktort, akkor a Java futtatórendszer automatikusan (implicit) a szülőosztály paraméter nélküli konstruktorát hívja meg, még mielőtt a konstruktoron belül bármi utasítást végrehajtana.

Megjegyzés: ha a szülő osztályban nem áll rendelkezésre paraméter nélküli konstruktor, akkor fordítási hibát kapunk. Ilyen esetben kötelesek vagyunk explicit paraméteres konstruktorhívást alkalmazni.