Java 何时执行类静态变量语句?

Java 何时执行类静态变量语句?,java,static,Java,Static,我正在用Java构建一个使用BorderLayout的GUI程序。具体来说,它只使用中心、页面结尾和线条结尾区域。我有一个针对每个领域的课程,他们通常需要分享信息。我的主课和末课是这样开始的: public class JSudokuSolver extends JFrame { protected static Dimension sBoardDim = new Dimension(500, 500); protected static Dimension

我正在用Java构建一个使用BorderLayout的GUI程序。具体来说,它只使用中心、页面结尾和线条结尾区域。我有一个针对每个领域的课程,他们通常需要分享信息。我的主课和末课是这样开始的:

public class JSudokuSolver extends JFrame {
    protected static Dimension      sBoardDim = new Dimension(500, 500); 
    protected static Dimension     lineEndDim = new Dimension(200, 500); 
    protected static Dimension     pageEndDim = new Dimension(650, 120); 
    ...

有时候这很管用;有时候不是。如果没有,则在尝试在PAGE_END_objs代码中使用“pageEndDim”时(在本例中)会得到一个空指针。然后在EclipseNeon调试模式下,如果我将鼠标悬停在“JSudokuSolver.pageEndDim”上,我会看到维度数据。但是,如果我将鼠标悬停在“pageEndDim=”上,就会看到“null”


在我看来,静态任务似乎还没有发生。是/否?如果是,什么时候发生,是什么触发的?如果没有,我希望你有有用的信息吗?蒂亚

在一致的Java运行时环境中,类的
静态
变量将在使用该类的任何代码能够访问它们之前被完全初始化*

如果您得到一个NPE访问
pageEndDim
,则在加载类后,某个地方将
null
分配给
pageEndDim
。你可以考虑制作这些变量<代码>最终< /代码> .<

*如果初始值设定项彼此依赖,或者您有
静态
初始值设定项块进行初始化,则会变得有点复杂,但这里不是这样。

在一致的Java运行时环境中,在使用类的任何代码都可以访问它们*之前,类的
静态
变量将被完全初始化

如果您得到一个NPE访问
pageEndDim
,则在加载类后,某个地方将
null
分配给
pageEndDim
。你可以考虑制作这些变量<代码>最终< /代码> .<

*如果初始值设定项彼此依赖,或者您有
静态
初始值设定项块执行初始化,则会变得有点复杂,但这里的情况并非如此。

静态字段是在类装入器装入类时初始化的。此时将指定默认值。在初始化任何实例变量之前,将首先初始化这些变量。

静态字段在类加载器加载类时初始化。此时将指定默认值。在初始化任何实例变量之前,将首先初始化这些变量。

初始化器在类加载时运行。
静态
初始化器-在运行类之前,无法访问该类。然而,这些变量并不是
最终的
-您是否将它们分配到某个地方的
null
?我认为这里需要一个“何时执行类静态变量语句?”参见哇!感谢您的闪电回复!不,我没有将这些变量赋值为null。是的,所有类都在同一个包中。我将尝试“final”技术,并明确阅读“Java order of I and I”信息。静态初始值设定项在类加载后运行,而不是在加载时运行。顾名思义,初始值设定项在初始化时运行,这可能比加载时间长。
JSudokuSolver
的初始化应该在
PAGE_END_objs
初始化期间通过引用
JSudokuSolver.pageEndDim
触发,所以我猜
PAGE_END_objs
没有被初始化。参见JLS§12.4.1.
静态
初始化器在类加载时运行-在类运行之前无法访问它。然而,这些变量并不是
最终的
-您是否将它们分配到某个地方的
null
?我认为这里需要一个“何时执行类静态变量语句?”参见哇!感谢您的闪电回复!不,我没有将这些变量赋值为null。是的,所有类都在同一个包中。我将尝试“final”技术,并明确阅读“Java order of I and I”信息。静态初始值设定项在类加载后运行,而不是在加载时运行。顾名思义,初始值设定项在初始化时运行,这可能比加载时间长。
JSudokuSolver
的初始化应该在
PAGE_END_objs
初始化期间通过引用
JSudokuSolver.pageEndDim
触发,所以我猜
PAGE_END_objs
没有被初始化。请参阅JLS§12.4.1。“如果初始化程序相互依赖,或者您使用静态初始化程序块进行初始化,则会变得有点复杂,但这里的情况并非如此。”但是,这里的情况正是如此@LewBloch:不,引用的代码中没有
静态
初始值设定项块,也没有初始值设定项之间对声明的任何相互依赖关系;它们不需要是积木。还有一种依赖性
PAGE\u END\u objs.pageEndDim
在静态初始化中依赖于
JSudokuSolver.pageEndDim
。@LewBloch:我的意思是类中的“相互依赖”,我认为这一点非常清楚
PAGE\u END\u objs
访问
JSudokuSolver.pageEndDim
触发
JSudokuSolver
的初始化。此时,它将不会为
null
。不存在相互依赖关系。@LewBloch:根据定义,在引用类获取其值时,所讨论的变量不能被取消初始化。我很想看到该语句的一个反例,比如:“一个类或接口类型T将在第一次出现以下任何一个之前被初始化……使用一个由T声明的静态字段,并且该字段不是一个常量变量。”“如果初始值设定项相互依赖,或者有静态初始值设定项块进行初始化,这会变得有点复杂,但这里不是这种情况。”但是,这里正是这种情况!@LewBloch:不,引用的代码中没有
静态
初始值设定项块,它们之间也没有任何相互依赖关系
public class PAGE_END_objs {
    static Dimension      pageEndDim = JSudokuSolver.pageEndDim;
    ...