2010-12-09 76 views
3

我们如何调用grand parent的构造函数。我该如何调用盛大父类的构造函数?

例如:B继承自AC继承自B

我需要在C中调用A的构造函数。有没有可能创建B的实例?

如果我需要这个如何在Java中实现。

+1

你能否提供更多细节,为什么你需要调用盛大父类的构造主叫不叫父母的?如果C类需要在不调用类B的构造函数的情况下调用类A的构造函数,那么听起来像您可能需要查看您的设计,而不是试图找出一种方法来跳过调用父类的构造函数。 – ihatemash 2010-12-09 12:49:36

回答

3

使用super()从C和从B到访问的构造函数

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(); 
    } 
} 

输出:

一个

Ç

注:

如果全部都是默认构造函数,那么不需要来编写​​它会隐式调用它。

如果有参数化的构造函数,然后super(parameter..)需要

+0

thanxs给了一个例子... – 2010-12-09 12:40:26

6

你不能调用的A构造直接的C构造。

虽然你可以(实际上必须)间接调用它。 B的每个构造函数都必须调用构造函数A(显式或隐式)。由于C的每个构造函数都需要调用B的构造函数之一,因此您将总是称为A的构造函数之一。

2

D同样也叫B的构造函数,并反过来B就调用构造函数... 有没有其他选择调用大父类的构造

0

一个例子勒夫的回答是:

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)")}; 
} 

现在称:

C c = new C(); 

会产生:A()B()C(),同时通话ing:

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

将产生:A(Object)B(Object)C(Object)

正如你所看到的,通过操纵super()调用你可以实际调用显式父构造函数。

0

实际上,如果你有B类扩展类A,当你创建类B的实例时,你无法避免调用A的构造方法。如果这种机制似乎并不清楚,我推荐这篇关于Java继承系统的文章:http://download.oracle.com/javase/tutorial/java/IandI/subclasses.html

下面是一个例子:

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(); 
    } 
} 

创建具有new C()一个新的对象将涉及按顺序的A() - B() - C()

相关问题