第2个回答 2010-11-19
我做了个测试:
class A
{
public A()
{
System.out.println("----------A 构造-------------");
}
static
{
System.out.println("----------A 静态块-------------");
}
{
System.out.println("----------A 语句块-------------");
}
}
class B extends A
{
public B()
{
System.out.println("----------B 构造-------------");
}
static
{
System.out.println("----------B 静态块-------------");
}
{
System.out.println("----------B 语句块-------------");
}
}
public class Test
{
public static void main(String[] args)
{
B b=new B();
}
}
输出为:
----------A 静态块-------------
----------B 静态块-------------
----------A 语句块-------------
----------A 构造-------------
----------B 语句块-------------
----------B 构造-------------
所以顺序为父类静态块->子类静态块->父类自由块->父类构造->子类自由块->子类构造,原因是类加载器初次加载class时会调用静态块,之后就是先构造父类然后子类。
我将主方法修改:
public class Test
{
public static void main(String[] args)
{
B b=new B();
B b1=new B();
}
}
则输出为:
----------A 静态块-------------
----------B 静态块-------------
----------A 语句块-------------
----------A 构造-------------
----------B 语句块-------------
----------B 构造-------------
----------A 语句块-------------
----------A 构造-------------
----------B 语句块-------------
----------B 构造-------------
以上代码说明了这种调用顺序