何时初始化静态字段?如果我从不实例化一个类,但是我访问一个静态字段,是否所有静态块和私有静态方法用于实例化那个时刻调用的私有静态字段(按顺序)?
如果我调用静态方法怎么办?它是否也运行所有静态块?方法之前?
可能重复:
Java静态类初始化
为什么字符串变量在初始化块中更新而不是整数(即使先写入块)
class NewClass
{
static
{
System.out.println(NewClass.string+" "+NewClass.integer);
}
final static String string="static";
final static Integer integer=1;
public static void main(String [] args)//throws Exception
{
}
}
Run Code Online (Sandbox Code Playgroud)
我的输出是
static null
Run Code Online (Sandbox Code Playgroud)
PS:还注意到只有当我插入final修饰符时,字符串变量初始化才会发生在块之前.为什么会这样?为什么不是整数?我已经将它声明为最终静态
我根本不理解以下代码的执行流程:
class Test {
static String s1 = getVal();
static String s2 = "S2";
private static String getVal() {
return s2;
}
public static void main(String args[]) {
System.out.println(s2); // prints S2
System.out.println(s1); // prints null
}
}
Run Code Online (Sandbox Code Playgroud)
它应该S2在第二个println声明打印.我更感兴趣的是理解为什么会发生这种情况而不是解决方案.
以下示例定义了2个静态变量。变量1(myBoolean1)在MySingletonExample(实例)变量上方定义。
变量2(myBoolean2)在MySingletonExample(实例)变量下定义。
两个变量都设置为true,但是只有1个变量(myBoolean1)在显示时显示正确的值。
public class MySingletonExample
{
//static volatile boolean myBoolean1 = false;
static boolean myBoolean1 = false;
private static volatile MySingletonExample instance = new MySingletonExample();
//static volatile boolean myBoolean2 = false;
static boolean myBoolean2 = false;
private MySingletonExample()
{
myBoolean1 = true;
myBoolean2 = true;
}
protected static MySingletonExample getInstance()
{
System.out.println("myBoolean1 = " + myBoolean1);
System.out.println("myBoolean2 = " + myBoolean2);
return instance;
}
public static void main(String[] args)
{
MySingletonExample.getInstance();
System.out.println("---------------------------");
MySingletonExample.getInstance();
}
}
Run Code Online (Sandbox Code Playgroud)
执行时,这是输出。
myBoolean1 …