2009-11-23 4 views
0

나는 C# 몇 년을 썼고 자바를 배우기 시작했다. 오늘 나는 샘플이 이상하게 보인 것을 보았다. 그것은 C#에서 일어날 수 없다. 생성자 페인트()) (주 화재 및 매개 변수가 될 것입니다
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); 
    } 
} 

에서 - "g"anythings를 초기화하지 않은, 그것은 자바의 숨겨진 기능을하지만, 이는 아니다 OOP에 법적으로?

+0

코드의 형식을 고려하십시오. – ukanth

답변

4

여기서 불법적 인 것은 무엇입니까? JFrame을 확장하고 paint() (메서드, 생성자 아님) 메서드 만 재정의합니다. 나머지는 모든 상속 된 행동입니다.

JFrame 및 그 조상의 소스 코드를 확인하면 어느 시점에 setVisibile()으로 전화하면 paint()이 호출됨을 알 수 있습니다. 또한 올바른 Graphics 개체를 제공합니다.


동작은이 미니 예제와 동일합니다. 명령 줄에 "Bar"이 출력됩니다. 어떤 의미가 있습니다. 의 생성자에서 호출되는 runMe() 메서드를 재정의하면 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#에서 '재정의'키워드로 상태를 지정해야하므로 재정의라고 생각하지 않았습니다. 자바 문서에서 검색 한 후 http://java.sun.com/docs/books/tutorial/java/IandI/override.html 자바가 도움말을 참조 할 수 없다는 것을 알고 있습니다. 감사합니다. – Cheung

+0

그래도 좋지만해야합니다. 그것을 덧붙이면 ('@ Override') 컴파일러가 여러분이 무언가를 덮어 썼다고 생각할 때 경고하지만 실제로는 그렇지 않습니다. – jitter

2

는이 라인

public class MainClass extends JFrame 

당신은 그래픽 컨텍스트의 설정까지 포함하여 JFrame의 클래스에서 많은의 추가 기능을 얻고있는 볼 필요가있다.

페인트()은 생성자가 아니며, 클래스의 메서드로, 프레임을 표시하도록 설정 한 결과 호출됩니다.

+0

대단히 감사합니다. – Cheung

3

paint()는 생성자가 아닙니다. paint()는 생성 한 프레임을 그릴 필요가있을 때 Swing에 의해 호출 될 메소드입니다.

tutorial on SwingJFrame에 대한 Javadocs를 읽어보십시오.

+0

대단히 감사합니다. – Cheung