2014-12-30 3 views
-1

저는 2 년 넘게 Java로 프로그래밍을 해왔습니다. 멤버 변수에 대한 세부 사항을주의 깊게 살펴보고 클래스가 초기화되는 방식에 대한 호기심을 나타 냈습니다.Java 클래스 초기화 순서

나는 게임에 일하고 있어요 및 GameState를 확장 내 수업, GameStateMenu,에,이 멤버 변수가 : I합니다 (superclass에서 강제로 상속되는 init() 방법이

private int buttonPadding = 10; 

superclass constructor에서 호출), 그 중 을 init() 메소드 내부에 호출하면 0을 출력합니다.

또한 GameStateMenu 클래스의 내부 update() 방법이있다, 그리고 나는 그것의 내부, 코드, System.out.println(buttonPadding)의 같은 라인을 넣어, 그것은 10.

GameState 클래스 밖으로 인쇄 계속 :

public abstract class GameState { 

    public GameState() { 
     init(); 
    } 

    protected abstract void init(); 

    public abstract void load(); 

    public abstract void update(); 

    public abstract void render(); 

    public void dispose() { 
     return; 
    } 
} 

을 클래스 :

public class GameStateMenu extends GameState { 

    ... 
    private int buttonPadding = 10; 

    @Override 
    protected void init() { 
     System.out.println(buttonPadding); // prints out 0 
     ... 
    } 

    ... 

    @Override 
    public void update() { 
     System.out.println(buttonPadding); // prints out 10 
     ... 
    } 
    ... 
} 

내가 이해할 수없는 것은 wh y buttonPaddinginit() 메서드가 호출 될 때 0이고 클래스가 완전히 초기화되고 update() 메서드가 호출되면 정기적으로 buttonPadding이 초기화되어 10가 인쇄됩니다. 왜이 작업을 수행합니까? 그리고/또는 Java의 초기화 순서는 무엇입니까?

정적 인 경우 buttonPadding을 올바르게 만들었지 만 올바르게 작동하지만 여전히 구성원 변수가 설정되지 않은 이유에 대해 궁금합니다.

+0

상황을보다 명확하게 보여주기 위해 상황의 [minimal code example] (http://stackoverflow.com/help/mcve)을 만드는 것이 좋습니다. – Sebi

+0

실제 코드를 게시 할 수 있습니까? 너의 설명과 약간 혼란스러워. buttonPadding이 전역 변수 인 경우에는 '정적'으로 선언해야한다고 생각합니다. 그렇지 않으면 실제로 멤버 변수이고 GameState는이 변수에 액세스 할 수 없습니다. – Dtor

+0

게시물을 일부 코드로 업데이트하고 내 문법을 '멤버 변수'대신 '전역 변수'로 지정하는 방법을 수정했습니다. – CoderMusgrove

답변

2

자식 클래스 (GameStateMenu) 전에 부모 클래스 (GameState)가 완전히 초기화됩니다. 즉, 어떤 초기화가 에서 일어나기 전에 GameState 생성자가 호출되기 때문에 buttonPadding에는 여전히 0 인 할당되지 않은 int에 대한 기본값이 있습니다. GameState이 완전히 초기화되면 GameStateMenu이 초기화되고 처음에는 buttonPadding이 0으로 설정되고 생성자가 호출됩니다.

자발적인 조언 : 일반적으로 부모 클래스 생성자가 하위 클래스에 정의 된 메서드를 호출하는 것은 바람직하지 않습니다. 자식 클래스는 부모 클래스의 불변량을 깨뜨릴 수 있습니다. 이 특별한 경우에는 추상 클래스 대신 인터페이스가 필요할 것으로 보이지만 코드에 대해 더 알지 못해도 말하기는 어렵습니다.