一道面试题目,看代码:
public class Testinitial
{
public static void main(String[] args)
{
// 第一种情况
int a = Test2.a;
// 第二种情况
// int a = Test2.b;
System.out.println("main method");
}
static
{
System.out.println("main static block");
}
}
class Test1
{
static int a = (int) Math.random() * 5;
static
{
System.out.println("test1 static block");
}
}
class Test2 extends Test1
{
static int b = (int) Math.random() * 10;
static
{
System.out.println("test2 static block ");
}
}
结果是否与你想的一样:
// 第一种情况 执行结果
main static block
test1 static block
main method
//注释第一种情况,放开第二种情况的注释代码
//执行结果
main static block
test1 static block
test2 static block
main method
初始化顺序:
1)它的子类要初始化,它作为祖先类,被装入并初始化.
2)对它的非final型的static 成员(数据成员使用或赋值,方法成员调用),装入并初始化.
3)对它的final static 型常量(且编译时值已知)的使用,会装入该类但不会被初始化
否则:即它的final static 型常量(且编译时值未知)的使用,会装入该类且会被初始化
4)其它操作(如:反射或Class.forName(...)等等..)
有疑问的一句话是 第一种情况。
int a = Test2.a;
仅仅引起了Test2父类的成员变量a 的初始化,已经装载了Test2,但是并没有引起Test2本身初始化。。。
这里我以前也没搞清楚。。
2011-02-23 david.wang