Java类初始化顺序

时间:2014-12-30 00:41:10

标签: java member

我已经用Java编程了两年多了,我刚刚决定密切关注成员变量的细节,并且让我对如何初始化类感到好奇。

我正在开发一款游戏,而在我的班级中GameStateMenu扩展GameState,我有这个成员变量:

private int buttonPadding = 10;

我有一个init()方法,该方法来自superclass(从superclass constructor调用)强制继承,如果我在{{1}内调用System.out.println(buttonPadding)方法,它打印出init()

0类中还有一个update()方法,我在其中放入了同一行代码GameStateMenu,并且它会一直打印出来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 ... } ... } 在调用buttonPadding方法时0init(),但是一旦完全初始化了类,update()正在调用方法,定期buttonPadding已初始化并打印出10。为什么这样做和/或Java的初始化顺序是什么?

虽然如果我buttonPadding静态,它可以正常工作,但我仍然很好奇为什么成员变量没有设置。

1 个答案:

答案 0 :(得分:2)

父类(GameState)在子类(GameStateMenu)之前完全初始化。这意味着GameState构造函数在GameStateMenu中进行任何初始化之前都会被调用,因此此时buttonPadding仍然具有未分配的int的默认值,即零。 GameState完全初始化后,GameStateMenu初始化 - 首先将buttonPadding设置为零,然后调用构造函数。

未经请求的建议: 父类构造函数调用子类中定义的方法通常是个坏主意。它允许子类破坏父类中的不变量。在这种特殊情况下,看起来你可能想要一个接口而不是一个抽象类,但是如果不了解你的代码就很难说。