2010-12-09 24 views
3

Comment peut-on appeler le constructeur du grand parent. Exemple: B hérite de A et C hérite de B. J'ai besoin d'appeler le constructeur de A en C. Est-il possible sans créer une instance de B?Comment puis-je appeler le constructeur de la classe grand parent?

Si j'en ai besoin, comment cela peut-il être implémenté en Java?

+1

Pouvez-vous donner plus de détails pourquoi vous avez besoin d'appeler le constructeur de grand parent sans appeler le parent? Off-the-cuff, si la classe C doit appeler le constructeur de la classe A sans appeler le constructeur de la classe B, il semble que vous ayez besoin de regarder votre design au lieu d'essayer de trouver un moyen d'ignorer le constructeur du parent . – ihatemash

Répondre

3

utilisation super() de C et de B à accéder au constructeur de A

class A { 
    public A() { 
     System.out.println("A"); 
    } 
} 

class B extends A { 
    public B() { 
     super(); 
     System.out.println("B"); 
    } 
} 

class C extends B { 
    public C() { 
     super(); 
     System.out.println("C"); 
    } 
} 

public class Inheritance { 
    public static void main(String[] args) { 
     C c = new C(); 
    } 
} 

sortie:

A
B
C

Note:

Si tous sont constructeur par défaut alors pas besoin pour écrire super(); il l'appellera implicitement.

S'il est constructeur alors paramétré super(parameter..) est nécessaire

+0

merci de donner un exemple ... –

+0

encore une question ..le même comportement se produira dans le cas de C++ –

+0

@Ashish Check it [ici] (http://stackoverflow.com/questions/120876/c-superclass-constructor -calling-rules) –

6

Vous ne pouvez pas invoquer le constructeur de A directement dans le constructeur de C.

Vous pouvez (et devez en fait) l'appeler indirectement, "cependant. Chaque constructeur de B doit appeler un constructeur de A (explicitement ou implicitement). Puisque chaque constructeur de C doit appeler l'un des constructeurs de B, appelez toujours l'un des constructeurs A s.

2

C devra appeler le constructeur de B et à son tour B appellera constructeur de A ... il n'y a pas d'autre possibilité d'appeler constructeur de grand-parent

0

Un exemple à la réponse de Joachim:

class A { 
    A() { System.out.print("A()")}; 
    A(Object o) { System.out.print("A(Object)")}; 
} 
class B { 
    B() { super(); System.out.print("B()")}; 
    B(Object o) { super(o); System.out.print("B(Object)")}; 
} 
class C { 
    C() { super(); System.out.print("C()")}; 
    C(Object o) { super(o); System.out.print("C(Object)")}; 
} 

maintenant appeler:

C c = new C(); 

produira: A()B()C(), tout appel ING:

C c = new C(new Object()); 

produira: A(Object)B(Object)C(Object).

Comme vous pouvez le voir, en manipulant super() appel vous pouvez réellement appeler le constructeur parent explicite.

0

En fait, si vous avez une classe A de classe B, vous ne pouvez pas éviter d'appeler la méthode constructeur pour A lorsque vous créez une instance de la classe B.Si ce mécanisme ne vous semble pas clair, je recommande cette lecture sur le système d'héritage de Java: http://download.oracle.com/javase/tutorial/java/IandI/subclasses.html.

Voici un exemple:

class A { 
    public A() { 
     doSomethingA(); 
    } 
} 

class B extends A { 
    public B() { 
     super(); // this is the call to the A constructor method 
     doSomethingB(); 
    } 
} 

class C extends B { 
    public C() { 
     super(); // this is the call to the B constructor method 
     doSomethingC(); 
    } 
} 

Création d'un nouvel objet avec new C() impliquera, dans l'ordre, l'appel de A() - B() - C()