我已经用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
方法时0
为init()
,但是一旦完全初始化了类,update()
正在调用方法,定期buttonPadding
已初始化并打印出10
。为什么这样做和/或Java的初始化顺序是什么?
虽然如果我buttonPadding
静态,它可以正常工作,但我仍然很好奇为什么成员变量没有设置。
答案 0 :(得分:2)
父类(GameState
)在子类(GameStateMenu
)之前完全初始化。这意味着GameState
构造函数在GameStateMenu
中进行任何初始化之前都会被调用,因此此时buttonPadding
仍然具有未分配的int的默认值,即零。 GameState
完全初始化后,GameStateMenu
初始化 - 首先将buttonPadding
设置为零,然后调用构造函数。
未经请求的建议: 父类构造函数调用子类中定义的方法通常是个坏主意。它允许子类破坏父类中的不变量。在这种特殊情况下,看起来你可能想要一个接口而不是一个抽象类,但是如果不了解你的代码就很难说。