{
public static final int a = 6 / 3;
static
{
System.out.println("static");
}
}
public class FinalTest
{
public static void main(String[] args)
{
System.out.println(A.a);
}
}
代码的运行结果为:2
package proxy;
import java.util.Random;
class A
{
public static final int a = new Random().nextInt(100);
static
{
System.out.println("static");
}
}
public class FinalTest
{
public static void main(String[] args)
{
System.out.println(A.a);
}
}
运行结果为:
static
30
这是因为第一个例子在类编译的时候就确定了值为2.类的初始化涉及到主动使用,这个类没有初始化。第二个例子只有在类运行的时候才知道a的值是多少。所以在运行时必须初始化。
如果把final去掉则在例子一中静态代码块也能执行。
package proxy;
class Parent
{
static int a = 3;
static
{
System.out.println("Parent static block!");
}
static void doSomething()
{
System.out.println("Parent doSomeThing!");
}
}
class Child extends Parent
{
static
{
System.out.println("Child static block!");
}
}
public class Test2
{
/**
* @param args
*/
public static void main(String[] args)
{
System.out.println(Child.a);
Child.doSomething();
}
}
结果:
Parent static block!
3
Parent doSomeThing!
只有当程序访问的静态变量或静态方法确实是当前类或当前接口中定义时,才可以认为是对类或接口的主动使用。
package proxy;
class Parent
{
static
{
System.out.println("Parent static block!");
}
}
public class Test2
{
/**
* @param args
* @throws ClassNotFoundException
*/
public static void main(String[] args) throws ClassNotFoundException
{
ClassLoader cl = ClassLoader.getSystemClassLoader();
Class<?> cla = cl.loadClass("proxy.Parent");
System.out.println("-------------------------------");
cla = Class.forName("proxy.Parent");
}
}
打印结果:
-------------------------------
Parent static block!
第一个只是把类加载到内存,并没有对类的主动使用。