public class Test1
{
public static int k = 0;
public static Test1 t1 = new Test1("t1");
public static Test1 t2 = new Test1("t2");
public static int i = print("i");
public static int n = 99;
public int j = print("j");
{
print("构造快");
}
static
{
print("静态快");
} public Test1(String str)
{
System.out.println((++k) + ":" + str + "     i=" + i + "  n=" + n);
++i;
++n;
} public static int print(String str)
{
System.out.println((++k) + ":" + str + "     i=" + i + "  n=" + n);
++n;
return ++i;
} public static void main(String[] args)
{
Test1 t = new Test1("init");
}
}

解决方案 »

  1.   

    对象的初始化顺序:首先执行父类静态的内容,父类静态的内容执行完毕后,接着去执行子类的静态的内容,当子类的静态内容执行完毕之后,再去看父类有没有非静态代码块,如果有就执行父类的非静态代码块,父类的非静态代码块执行完毕,接着执行父类的构造方法;父类的构造方法执行完毕之后,它接着去看子类有没有非静态代码块,如果有就执行子类的非静态代码块。子类的非静态代码块执行完毕再去执行子类的构造方法。总之一句话,静态代码块内容先执行,接着执行父类非静态代码块和构造方法,然后执行子类非静态代码块和构造方法。注意:子类的构造方法,不管这个构造方法带不带参数,默认的它都会先去寻找父类的不带参数的构造方法。如果父类没有不带参数的构造方法,那么子类必须用supper关键子来调用父类带参数的构造方法,否则编译不能通过。
      

  2.   

    http://blog.csdn.net/ysjian_pingcx/article/details/19605335 自己看把
      

  3.   

    这都多少遍了静态>实例静态变量>静态快实例变量>构造块>构造方法
      

  4.   

    程序在加载一个类的时候,分几步:
    一,先找到该类,加载进内存;
    二,把类里的静态成员初始化,并赋默认值,(基本类型为0,boolean 为false),引用类型为null;静态块分配空间,但是不执行内部代码
    三,赋值初始值,执行静态块,块.
    四,执行构造方法.上面程序的执行顺序是这样的:
    1.找到Text1,加载进内存
    2.把类里的静态成员初始化,得到结果是
      k=0(这个0不是赋值的0,而是系统默认的0);t1=null;t2=null;i=0;n=0;静态块分配空间,但是不执行内部代码.
    3.给静态成员赋值 
      k=0(这个0是赋值的0);t1=new Test("t1");
    到这的时候,Test又new了一个对象,同样按照上面的步骤执行对t1的实例化(这有点像递归)
    {
     1.找到Text1,加载进内存
     2....(注意,因为这里的静态成员已经在Test1分配到内存了,因为静态成员只加载一次,所以这里不会再给静态成员赋值)
     4.到了j,因为j不是静态的,所以j是属于t1的,这个时候,给j赋值,就要执行j的print方法了,所以会先输出t1的print("j");
       1:j     i=0  n=0
     5.赋值完后,开始代码.先是静态块(这里的静态块在Test中已经分配内存了,因为静态成员只加载一次,所以这里不会执行静态块),然的是块(这个块属于t1,所以会执行){print("构造快");}
       输出 2:构造快     i=1  n=1; 
     6.接着构造方法
       输出 3:t1     i=2  n=2
    }
    t2同t1地样实现,所以接着输出
     4:j     i=3  n=3
     5:构造快     i=4  n=4
     6:t2     i=5  n=5
    这个时候Test的赋值到了i,执行t的print("i");
     接着输出 7:i     i=6  n=6
    然后n=99;然后是j的print("j");接着是静态块,然后是Test的块,最的构造方法.这里需要注意的是,静态的只加载一次,但为什么在t1,t2的时候不输出静态块的内容,而在Test中输出呢,原因是静态块在Test1时已经加载了,但是没有初始化,初始化的步骤是在Test中进行的,而t1和t2中根本就没有加载该静态块,更谈不上初始化了.参考资料 http://www.cnblogs.com/alexlo/archive/2013/03/05/2944573.html
      

  5.   

    楼上貌似正解 有一点不懂 public static Test1 t1 = new Test1("t1"); 是先t1=null再new吗 这是从jvm里学到的?什么书?