2014-12-30 89 views
-1

我已經使用Java進行了兩年多的Java編程,並且我決定密切關注成員變量的細節,並且對我如何初始化類感到好奇。Java類初始化命令

我工作的一個遊戲,在我的課,GameStateMenu,延伸GameState,我有這樣的成員變量:

private int buttonPadding = 10; 

我有一個是通過武力從superclass繼承了init()方法(從superclass constructor調用),如果我在init()方法中調用System.out.println(buttonPadding),它會打印出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; 
    } 
} 

GameStateMenu類別:

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當init()方法被調用時,y buttonPadding0,但是一旦類被完全初始化,並且update()方法被調用,定期地,buttonPadding已經被初始化並且正在打印出10。它爲什麼這樣做和/或什麼是Java的初始化順序?

雖然,如果我使buttonPadding靜態,它工作正常,但我仍然好奇爲什麼沒有設置成員變量。

+0

您可能需要考慮創建一個[最小代碼示例](http://stackoverflow.com/help/mcve)以更清楚地說明情況。 – Sebi

+0

你可以發佈有問題的實際代碼?我對你的描述有點困惑。如果buttonPadding是一個全局變量,我認爲它需要聲明爲'static',否則它實際上是一個成員變量,GameState將無法訪問它。 – Dtor

+0

我用一些代碼更新了這篇文章,並修復了關於將它稱爲「全局變量」而不是「成員變量」的語法。 – CoderMusgrove

回答

2

父類(GameState)在子​​類(GameStateMenu)之前完全初始化。這意味着GameState構造函數在GameStateMenu發生任何初始化之前被調用,因此此時buttonPadding仍然具有未分配int的默認值,該值爲零。在GameState獲得完全初始化後,GameStateMenu被初始化 - 首先將buttonPadding設置爲零,然後構造函數被調用。

未經請求的建議: 父類構造函數調用在子類中定義的方法通常是個壞主意。它允許子類破壞父類中的不變量。在這種特殊情況下,看起來你可能想要一個接口而不是抽象類,但是如果不知道更多關於代碼的內容,很難說。