2013-01-02 125 views
0

下面是一個簡單的例子。我有兩個抽象類,AB,一個具體類,C,其中包括抽象方法。java抽象類,構造函數未在超類中調用,爲什麼?

當我創建一個新的C時,我期望看到構造函數AB被調用。任何想法爲什麼他們不被稱爲?

//Q.java 
class Q { 
    abstract class A { 
     A() { 
      System.out.println("in A"); 
     } 
     public abstract void sayHi(); 
    } 
    abstract class B extends A { 
     B() { 
      super(); 
      System.out.println("in B"); 
     } 
    } 
    class C { 
     C() { 
      super(); 
      System.out.println("in C"); 
     } 
     public void sayHi() { 
      System.out.println("Hi!"); 
     } 
    } 

    Q() { 
     C Ccc = new C(); 
    } 

    public static void main(String[] args) { 
     Q z = new Q(); 
    } 
} 
+5

c類不延伸b或a ... 你應該寫'class c extends b {...' – ppeterka

+0

c不繼承a或b。所以你還沒有真的重寫方法 – mcalex

+0

以及C不擴展B或 –

回答

2

看,我們有超類對象,所有類都隱式擴展。所以如果我們有 public class A{} 那麼它相當於寫作 public class A extends Object{}。 但是如果你想擴展你自己的另一個類,那麼你必須明確提到它作爲 public class B extends A{} 否則java會把Object當作你的超類。 (注意:即使是這種情況,Object也是'B'的超類,但這是因爲它是'A'的超類,因此是'B')。所以如果你沒有明確地提到'B擴展A',那麼B類將有Object作爲唯一的超類。 在你不需要在子類構造函數中提到super()。這也被隱含地稱爲。

3

c類不會擴展類ba,因此使用super()它不能調用它們的構造函數,並調用Object構造來代替。

試試這個:

class c extends b { 
    public c(){ 
     super(); 
     //... 
    } 
} 
+0

這在技術上並不正確。如果'c'由'a'或者'b'組成,它當然可以調用其中任何一個構造函數。 – Woot4Moo

+0

對,我完成了答案:)謝謝你指出了。 –

+0

因此更改了我的投票:) – Woot4Moo

6

由於超類的c是如果你想看到兩個ab調用做Object

而且類名稱開頭大寫字母A,B,C,etc

這個:

class c extends b 
2

您應該從類c擴展抽象類。

class c extends b { 

沒有明確地延伸b,它相當於

class c extends Object { 

,因此調用super調用Object構造函數。

2

只是要:

class c extends b{ 

這將現在的工作..你還沒有擴展b在ç..

1

CB沒有任何關係。超級類C的是java.lang.Object默認

C應該像

class C extends B{ .. } 

延伸B在這種情況下,它將調用超類的構造函數。

此外,您不需要明確地調用super(),因爲它隱含在那裏。