web-dev-qa-db-fra.com

comment hériter le constructeur de la super classe en sous-classe

Comment hériter le constructeur d'une super classe à une sous classe?

36
Anil

Les constructeurs ne sont pas hérités, vous devez créer un nouveau constructeur à prototypage identique dans la sous-classe qui correspond à son constructeur correspondant dans la superclasse.

Voici un exemple de comment cela fonctionne:

class Foo {
    Foo(String str) { }
}

class Bar extends Foo {
    Bar(String str) {
        // Here I am explicitly calling the superclass 
        // constructor - since constructors are not inherited
        // you must chain them like this.
        super(str);
    }
}
47
Andrew Hare

Le constructeur de superclasse NE PEUT PAS être hérité dans une classe étendue. Bien qu'il puisse être invoqué dans le constructeur de classe étendue avec super () comme première instruction.

13
ManishS

Les constructeurs par défaut - les constructeurs publics sans arguments (déclarés ou implicites) - sont hérités par défaut. Vous pouvez essayer le code suivant pour un exemple de ceci:

public class CtorTest {
    public static void main(String[] args) {
        final Sub sub = new Sub();
        System.err.println("Finished.");
    }

    private static class Base {
        public Base() {
            System.err.println("In Base ctor");
        }
    }

    private static class Sub extends Base {
        public Sub() {
            System.err.println("In Sub ctor");
        }
    }
}

Si vous souhaitez appeler explicitement un constructeur à partir d'une super classe, vous devez faire quelque chose comme ceci:

public class Ctor2Test {
    public static void main(String[] args) {
        final Sub sub = new Sub();
        System.err.println("Finished.");
    }

    private static class Base {
        public Base() {
            System.err.println("In Base ctor");
        }

        public Base(final String toPrint) {
            System.err.println("In Base ctor.  To Print: " + toPrint);
        }
    }

    private static class Sub extends Base {
        public Sub() {
            super("Hello World!");
            System.err.println("In Sub ctor");
        }
    }
}

La seule mise en garde est que l'appel super () doit venir comme la première ligne de votre constructeur, sinon le compilateur se fâchera contre vous.

5
MCory

Lisez à propos de super mot-clé (Faites défiler les constructeurs de sous-classe). Si je comprends votre question, vous voulez probablement appeler un constructeur de superclasse?

Il est intéressant de noter que le compilateur Java placera automatiquement un appel de constructeur sans argument à la superclasse si vous n'appelez pas explicitement un constructeur de superclasse.

3
RichardOD

Vous héritez des attributs de classe, pas des constructeurs de classe. Voici comment cela se passe:

Si aucun constructeur n'est ajouté dans la super classe, sinon, le compilateur ajoute un constructeur sans argument. Ce constructeur par défaut est invoqué implicitement chaque fois qu'une nouvelle instance de la sous-classe est créée. Ici, la sous-classe peut ou non avoir un constructeur, tout va bien.

si un constructeur est fourni dans la super classe, le compilateur verra s'il s'agit d'un constructeur sans argument ou d'un constructeur avec des paramètres.

si aucun argument, le compilateur l'invoquera pour toute instanciation de sous-classe. Ici aussi, la sous-classe peut ou non avoir un constructeur, tout va bien.

si un ou plusieurs constructeurs de la classe parent ont des paramètres et qu'aucun constructeur args n'est absent, alors la sous-classe doit avoir au moins 1 constructeur où un appel implicite pour la construction de la classe parent est effectué via super (paramètres parent_contractor).

de cette façon, vous êtes sûr que les attributs de classe hérités sont toujours instanciés.

1
Java Main

Dites si vous avez

/**
 * 
 */
public KKSSocket(final KKSApp app, final String name) {
    this.app = app;
    this.name = name;
    ...
}

alors une sous-classe nommée KKSUDPSocket étendant KKSSocket pourrait avoir:

/**
 * @param app
 * @param path
 * @param remoteAddr
 */
public KKSUDPSocket(KKSApp app, String path, KKSAddress remoteAddr) {
    super(app, path, remoteAddr);
}

et

/**
 * @param app
 * @param path
 */
public KKSUDPSocket(KKSApp app, String path) {
    super(app, path);
}

Vous passez simplement les arguments dans la chaîne du constructeur, comme les appels de méthode aux super classes, mais en utilisant super (...) qui fait référence au constructeur de super-classe et passe dans les arguments donnés.

1
Chris Dennett