2010-12-09 75 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()

相關問題