class Bird
{
{System.out.println("b1");}
public Bird(){System.out.println("b2");}
}
class Raptor extends Bird
{
static {System.out.println("r1");}
public Raptor(){System.out.println("r2");}
{System.out.println("r3");}
static {System.out.println("r4");}
}class Hawk extends Raptor
{
public static void main(String[] args) 
{
System.out.println("h1");
new Hawk();
System.out.println("h2");
}
}
这个输出有点意外。
不是说静态初始块要在父类构造函数运行后才执行吗?h1应该在最先才对吧,请高手答疑。多谢。

解决方案 »

  1.   

    楼主你那程序好像有些问题 我自己敲了一个实例 对于理解静态方法 实例化方法 构造方法的先后调用顺序应该会有所帮助
    public class StaticTest{
    public static void main(String args[]){

    System.out.println("main Method1");
    Base b=new Sub();
    System.out.println("main Method2");
    }
    }

    class Base{

    public Base(){
    System.out.println("父类构造方法");
    }

    static{
    System.out.println("父类静态方法");
    }

    {
    System.out.println("父类实例化方法");
    }
    }

    class Sub extends Base {

    public Sub(){
    System.out.println("子类构造方法");
    }

    static{
    System.out.println("子类静态方法");
    }

    {
    System.out.println("子类实例化方法");
    }
    }
      

  2.   

    继承时,对象的初始化过程:
    (1)主类的超类由高到低按顺序初始化静态成员,无论静态成员是否为private。
    (2)主类静态成员的初始化。
    (3)主类的超类由高到低进行默认构造方法的调用。注意,在调用每一个超类的默认构造方法前,先进行对此超类进行非静态对象的初始化。
    (4)主类非静态成员的初始化。
    (5)调用主类的构造方法。
      

  3.   

    正解--signature------------------------------------
    http://www.mowker.com/list/
      

  4.   


    class Bird
    {
    static 
    {
    System.out.println("祖类的静态成员初始化");
    }

    {
    System.out.println("祖类的非静态成员初始化");


    public Bird()
    {
    System.out.println("祖类的构造函数调用");

    }
    class Raptor extends Bird
    {
    static 
    {
    System.out.println("父类的静态成员1初始化");
    }

    public Raptor()
    {
    System.out.println("父类的构造函数调用");


    {
    System.out.println("父类的非静态成员初始化");


    static 
    {
    System.out.println("父类的静态成员2初始化");
    }
    }class Hawk extends Raptor
    {
    static 
    {
    System.out.println("子类的静态成员初始化");
    }

    {
    System.out.println("子类的非静态成员初始化");


    public Hawk()
    {
    System.out.println("子类的构造函数调用");


    public static void main(String[] args) 
    {
    System.out.println("main函数开始运行");
    new Hawk();
    System.out.println("main函数结束运行");
    }
    }运行结果:祖类的静态成员初始化
    父类的静态成员1初始化
    父类的静态成员2初始化
    子类的静态成员初始化
    main函数开始运行
    祖类的非静态成员初始化
    祖类的构造函数调用
    父类的非静态成员初始化
    父类的构造函数调用
    子类的非静态成员初始化
    子类的构造函数调用
    main函数结束运行