2014-01-22 74 views
-4

我正在學習java編程。我嘗試運行下面的程序時遇到編譯錯誤。爲什麼superconstructor被調用?爲什麼我會錯誤地打印到屏幕?

public class Animal { 
    public Animal() { 
     System.out.println(「Making an Animal」); 
    } 
} 

public class Hippo extends Animal { 
    public Hippo() { 
     System.out.println(「Making a Hippo」); 
    } 
} 

public class TestHippo { 
    public static void main (String[] args) { 
     System.out.println(「Starting...」); 
     Hippo h = new Hippo(); 
    } 
} 

按我的理解,如果這個progragram沒有錯誤運行時,它將打印

Starting...

Making a Hippo

但在「深入淺出Java」的書中,他們提到的程序的輸出是

Starting...

Making an Animal

Making a Hippo

該輸出可能如何?我沒有調用超類構造函數,但是如何在這裏打印「製作動物」。

任何人都可以解釋這背後的邏輯?

如果我們調用子類的構造函數,它的超類constrtuctor是否也被執行?

而且爲什麼我得到編譯錯誤,我使用聯機IDE來測試基本的Java程序。

錯誤詳細信息

Compilation error comments (0) stdin copy Standard input is empty compilation info Main.java:3: error: illegal character: \8220 System.out.println(?Making an Animal?); ^Main.java:3: error: ';' expected System.out.println(?Making an Animal?); ^Main.java:3: error: illegal character: \8221 System.out.println(?Making an Animal?); ^Main.java:8: error: illegal character: \8220 System.out.println(?Making a Hippo?); ^Main.java:8: error: ';' expected System.out.println(?Making a Hippo?); ^Main.java:8: error: illegal character: \8221 System.out.println(?Making a Hippo?); ^Main.java:13: error: illegal character: \8220 System.out.println(?Starting...?); ^Main.java:13: error: ';' expected System.out.println(?Starting...?); ^Main.java:13: error: illegal start of expression System.out.println(?Starting...?); ^Main.java:13: error: illegal character: \8221 System.out.println(?Starting...?); ^Main.java:13: error: illegal start of expression System.out.println(?Starting...?); ^11 errors

+7

嘗試使用正常報價,例如''''而不是那些花哨的斜體。 –

+0

檢查你的引號! – Behe

+4

忽略你在你的代碼中有無效的引號,我會說這個代碼來自於這本書的章節詳細解釋它 –

回答

5

doc

Note: If a constructor does not explicitly invoke a superclass constructor, the Java compiler automatically inserts a call to the no-argument constructor of the superclass. If the super class does not have a no-argument constructor, you will get a compile-time error. Object does have such a constructor, so if Object is the only superclass, there is no problem.

所以,當你不顯式調用super(),樂編譯器插入它。 等效是

public class Hippo extends Animal { 
    public Hippo() { 
    super() 
    System.out.println(「Making a Hippo」); 
    } 
} 

編輯:正如克里斯指出,由堆棧跟蹤報告的問題來自於你用錯了引號。

應該

" " 

,而不是

「 」 
+1

那麼,如果這是被投票的答案,你可能想要解決有關花哨報價的問題,所以至少完成:) – Krease

+0

@ccheneson所以,如果是這樣的話,我們不需要提及Super()通過自己。編譯器會每次都照顧。對? –

+1

@Padmanabhan Vijay:是的,你可以省略super()的調用,編譯器會爲你調用它 – ccheneson

-3

構造的第一行是超級(); 因此,它會調用本構造的超類

+1

這是錯誤的/誤導 - 'super()'是**不是**「構造函數的第一行」 - 相反,如果沒有任何其他超級構造函數的調用,它將被隱式調用。 'super(1,2,3)'可以被使用,在這種情況下,不會調用'super()'。 – Krease

0

只是爲了總結:

How is this output possible? I didnt call the super class constructor, but how come "Making an Animal" printed Here.

超類的構造函數都會被自動調用當前構造函數執行代碼(同樣的效果,顯式調用super()之前第一行),即使您沒有明確地添加此

Why am I getting Compilation Error?

您沒有使用正確的引號。使用"而不是你的書法的東西。

您可以驗證他們是不同的這一點:

System.out.println((int) '"'); // 34 
System.out.println((int) '」'); // 8221 
0

您需要了解的構造函數鏈來詳細瞭解這個概念。 默認情況下,java中的每個構造函數都將調用超級調用構造函數或同一類中的其他重載構造函數。

對於前:

public Hippo() { 
System.out.println(「Making a Hippo」); 
} 

這是下同調用。

public Hippo() { 
super(); // Animal class constructor in your case 
System.out.println(「Making a Hippo」); 
} 

一篇簡要了解constructor chaining的文章。 同時解決編譯問題:

在所有SysOut語句中,用雙引號「...」替換爲"..."

0

的編譯錯誤來源於你的引號「」,他們應該是正常的格式化「」

0

默認的父類的構造被自動調用。
Creation of New Class Instances在Java語言規範:

This constructor does not begin with an explicit constructor invocation of another constructor in the same class (using this). If this constructor is for a class other than Object, then this constructor will begin with an explicit or implicit invocation of a superclass constructor (using super). Evaluate the arguments and process that superclass constructor invocation recursively using these same five steps. If that constructor invocation completes abruptly, then this procedure completes abruptly for the same reason. Otherwise, continue with step 4.

這可能聽起來很複雜,但它下面的一個例子是幾乎相同的例子。

0

在Java中,每個構造函數或者隱式地或顯式地調用超級構造函數。在隱式情況下(即如果你沒有手動調用super(...))這只是調用零元(無參數)超級構造函數,即任何構造是這樣的:

Class(...) { 
    // code... 
} 

是相同的:

Class(...) { 
    super(); 
    // code... 
} 

這意味着如果超類沒有定義空構造函數(沒有任何構造函數的類隱式定義了一個公共空構造函數),則必須使用super(...)

1

正如評論中所述,您的編譯錯誤是由使用花式引號「 」而不是普通引號" "引起的。如果您在Word中編寫代碼,然後將其粘貼到另一個程序中進行編譯,通常會發生這種情況。

對於構造函數部分,如果沒有顯式超級調用(帶或不帶參數),則無參數super()調用是隱式完成的 - 請參閱文檔here

相關問題