[英]Java Class Initialization Order
我從事Java編程已有兩年多了,我決定密切關注成員變量的細節,這使我對類的初始化產生了好奇。
我正在開發一個游戲,在我的類GameStateMenu
,該類擴展了GameState
,我具有以下成員變量:
private int buttonPadding = 10;
我有一個init()
方法,該方法是從superclass
(從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
...
}
...
}
我不明白的是為什么init()
方法被調用時buttonPadding
為什么為0
,但是一旦類被完全初始化並且update()
方法被調用后,定期地, buttonPadding
已被初始化並輸出10
。 為什么這樣做和/或Java的初始化順序是什么?
雖然,如果我將buttonPadding
靜態,則可以正常工作,但是我仍然對為什么未設置member變量感到好奇。
父類( GameState
)在子類( GameStateMenu
)之前已完全初始化。 這意味着,在GameState
的任何初始化發生之前,發生在構造函數被調用GameStateMenu
,所以在這一點上buttonPadding
仍然有一個未分配的int,它是默認值零。 之后GameState
被完全初始化, GameStateMenu
被初始化-第一buttonPadding
被設為零,則該構造被調用。
不請自來的建議:父類構造函數調用子類中定義的方法通常是個壞主意。 它允許子類打破父類中的不變式。 在這種特殊情況下,您可能想要接口而不是抽象類,但是如果不了解更多代碼,就很難說。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.