2010-02-23 13 views

Répondre

43

Les constructeurs ne sont pas hérités, vous devez créer un nouveau constructeur, prototypé de manière 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); 
    } 
} 
+1

Même en tant que programmeur Java non-n00b, cela n'est pas clair pour moi. Pourriez-vous clarifier? –

+0

@Bears va vous manger: Si la classe parente a un constructeur comme ceci: 'public Class (String arg1) {/ * implémentation ici/*}' alors la classe enfant en a besoin comme suit: 'public Subclass (String arg1) { super (arg1); } ' – Powerlord

+0

Cela ressemble à une manière élégante de dire" use 'super' dans le constructeur de la sous-classe." Je n'ai aucune idée de ce qu'est un prototype de constructeur en Java. –

3

Lire sur le super keyword (Faites défiler les Constructors sous-classe). Si je comprends votre question, vous voulez probablement appeler un constructeur de superclasse?

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

1

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 extension 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 le constructeur chaîne, comme les appels de méthodes aux super classes, mais en utilisant super (...) qui fait référence à la super-classe c onstructor et passe dans les args donnés.

5

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:

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 voulez 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 va se fâcher contre vous.

+1

Les constructeurs par défaut ne sont pas réellement "hérités". Si un constructeur public sans argument (par défaut AKA) existe dans la superclasse et n'est pas explicitement défini dans la sous-classe, et si la sous-classe n'a pas non plus de constructeurs surchargés explicitement définis (constructeurs avec paramètres), alors le compilateur insérer automatiquement dans la sous-classe un constructeur public sans argument contenant uniquement 'super(); Cela appelle le constructeur par défaut de la superclasse. – hotshot309

11

Le constructeur de super classe NE PEUT PAS être hérité en classe étendue. Bien qu'il puisse être invoqué dans les constructeurs de classes étendues avec super() comme première instruction.

+0

Oui ... ou vous pouvez invoquer n'importe quelle variante du constructeur de la superclasse que vous voulez utiliser (il pourrait ne pas avoir d'arguments, comme @GoodManish l'a dit, ou il pourrait en avoir plus). Il y a aussi des situations dans lesquelles 'super();' sera explicitement appelé par le compilateur avant que le reste du corps de l'un de vos constructeurs ne soit exécuté. – hotshot309

1

Vous héritez des attributs de classe, pas les constructeurs de classe .C'est comment ça se passe:

Si aucun constructeur est ajouté dans la super classe, si pas le compilateur ajoute un pas contructor 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 avoir ou non 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. S'il n'y a pas d'argument, le compilateur l'appellera pour toute instanciation de sous-classe. Ici aussi la sous-classe peut avoir ou non un constructeur, tout va bien.Si un ou plusieurs constructeurs de la classe parente ont des paramètres et qu'aucun constructeur d'arguments n'est absent, alors la sous-classe doit avoir au moins 1 constructeur où un appel implicite pour la construction de classe parent est effectué via super (parent_contractor params). De cette façon, vous êtes sûr que les attributs de classe hérités sont toujours instanciés.

+0

"le compilateur l'invoquera pour toute instanciation de sous-classe" - il semble que le point ci-dessus est que vous devez invoquer explicitement super() si votre sous-classe a un constructeur sans-arg. – Vlad

Questions connexes