2009-11-23 74 views
0

我已經寫了C#幾年,並開始學習Java,今天我看到一個示例是奇怪的,這是在C#中不可能發生的java, 。
http://www.java2s.com/Tutorial/Java/0261__2D-Graphics/Drawrectangles.htmJ2SE問題,構造函數自動運行?

public class MainClass extends JFrame { 

    public static void main(String[] a){ 
    MainClass f = new MainClass(); 
    f.setSize(300,300); 
    f.setVisible(true); 
    } 


    public void paint(Graphics g) { 
    g.drawRect(10, 10, 60, 50); 
    g.fillRect(100, 10, 60, 50); 
    g.drawRoundRect(190, 10, 60, 50, 15, 15); 
    g.fillRoundRect(70, 90, 140, 100, 30, 40); 
    } 
} 

構造paint()方法將火的main(),參數 - 「G」 未初始化anythings,它是基於Java的隱藏功能,但它不是在OOP上合法嗎?

+0

請考慮格式化您的代碼。 – ukanth

回答

4

這裏應該違法什麼?您正在擴展JFrame,並且只覆蓋方法paint()(方法,而不是構造函數)。剩下的就是所有的繼承行爲。

如果您檢查JFrame及其祖先的源代碼,您會看到在某個時刻撥打setVisibile()的電話將會呼叫paint()。並且還提供了正確的Graphics對象。


該行爲與此迷你示例中的行爲相同。它將在命令行上輸出「Bar」。這是有道理的。您覆蓋runMe()方法,該方法在Foo的構造函數中調用,該方法在Bar中繼承,因爲您沒有用/提供自己的方法來覆蓋它。

public class Test { 
    public static void main(String args[]) { 
     new Bar(); 
    } 
} 

public class Foo { 
    public Foo() { runMe(); } 
    public void runMe() { System.out.println("Foo"); } 
} 

public class Bar extends Foo { 
    public void runMe() { System.out.println("Bar");} 
} 
+0

謝謝你的回答,我從來沒有想過它是覆蓋,因爲在C#世界裏它需要通過「覆蓋」關鍵字來陳述。 我在java文檔搜索後, http://java.sun.com/docs/books/tutorial/java/IandI/override.html 我知道java可以跳過關鍵字。謝謝你的幫助 – Cheung

+0

是的,但應該更好添加它('@ Override'),以便編譯器在你認爲你覆蓋某些內容時發出警告,但實際上並非 – jitter

2

你需要看看這條線

public class MainClass extends JFrame 

你獲得額外的功能很多的從JFrame類,包括圖形上下文的建立。

請注意,paint()不是一個構造函數,它是類的一個方法,它被稱爲幀設置爲可見的結果。

+0

非常感謝。 – Cheung

3

paint()不是構造函數。 paint()是一個當Swing需要繪製你創建的框架時將被Swing調用的方法。

嘗試閱讀tutorial on Swing和Javadocs的JFrame

+0

非常感謝你。 – Cheung