public
class
Sample
{
public static void main(String[] args){
B ba = new B();
System.out.println( " ------------------------------- " );
B bb = new B();
}
};
class Target
{
public Target(String s){
System.out.println( " Target( " + s + " ) " );
}
};
class A
{
public static Target td = new Target( " static in A " );
static {
System.out.println( " static block in A " );
}
{
System.out.println( " non-static block in A " );
}
public Target ta = new Target( " in A " );
};
class B extends A
{
public Target tb = new Target( " in B " );
static {
System.out.println( " static block in B " );
}
static public Target tc = new Target( " static in B " );
{
System.out.println( " non-static block in B " );
}
};
{
public static void main(String[] args){
B ba = new B();
System.out.println( " ------------------------------- " );
B bb = new B();
}
};
class Target
{
public Target(String s){
System.out.println( " Target( " + s + " ) " );
}
};
class A
{
public static Target td = new Target( " static in A " );
static {
System.out.println( " static block in A " );
}
{
System.out.println( " non-static block in A " );
}
public Target ta = new Target( " in A " );
};
class B extends A
{
public Target tb = new Target( " in B " );
static {
System.out.println( " static block in B " );
}
static public Target tc = new Target( " static in B " );
{
System.out.println( " non-static block in B " );
}
};
结果:
Target(
static
in
A)
static block in A
static block in B
Target( static in B)
non - static block in A
Target( in A)
Target( in B)
non - static block in B
-------------------------------
non - static block in A
Target( in A)
Target( in B)
non - static block in B
static block in A
static block in B
Target( static in B)
non - static block in A
Target( in A)
Target( in B)
non - static block in B
-------------------------------
non - static block in A
Target( in A)
Target( in B)
non - static block in B
注意:
-
All data fields are initialized to their default value (0, false, or null).
-
All field initializers and initialization blocks are executed, in the order in which they occur in the class declaration.
-
If the first line of the constructor calls a second constructor, then the body of the second constructor is executed.
-
The body of the constructor is executed。
另外,可以看到:
先父类的static,后子类的static,然后父类的非static,再子类的非static。
static包括静态的字段和初始化块。
非static包括非静态字段和初始化块。
同级别的字段或初始化块的顺序就依赖于定义的先后了。
还有一点简单的,顺便提一下:
static的东东只在类装入的时候,执行一次。不是每次实例化一个对象时都执行。
顺便提第二点:在jdk5中因为支持可变参数列表所以,
public
static
void
main(String... args)
{}
是成立的。
另外,关于初始化问题参见:
http://www.javaworld.com/javaworld/jw-03-1998/jw-03-initialization.html?page=1