以下程序
class B 
{
B(int er) 
{
System.out.println("B(" + er + ")");
}
void f(int er)
  {
  System.out.println("f(" + er + ")");
  }
}
class T 
{
static B b1;
static //1
{
b1 = new B(1);


static B b2 = new B(2); //2
T()  //3               //4
{
System.out.println("T()");
b2.f(1);
}
void f2(int er) 
{
System.out.println("f2(" + er + ")");
}

}class Test
 {
  public static void main(String[] args)
  {
  System.out.println("Before");
  new T(); //4
  System.out.println("After");
  t.f2(1); //5
  }
  static T t = new T();
}
的输出结果为什么是
B(1)
B(2)
T()
f(1)
before
T()
T(1)
after
f2(1)

解决方案 »

  1.   

    static 可能是在编译器时,初始化的。
      

  2.   

    先运行static T t = new T();,然后调用static B b1;
    static //1
    {
    b1 = new B(1);


    static B b2 = new B(2); //2 
      

  3.   

    成员变量会首先被初始化,也就是说会先执行static T t = new T()
    在这个过程中,T里面又会对b1,b2进行初始化,然后才会执行T的构造函数,最后main方法执行,然而static变量只会被初始化一次,所以main方法里面的new T()不会对b1,b2进行初始化而是直接调用构造函数
      

  4.   

    LZ答案倒数第三个错了,应该是f1(1)
    B(1)
    B(2)
    T()
    f(1)
    before
    T()
    T(1)--------------------应该是f1(1)
    after
    f2(1)
      

  5.   

    结果是:
    B(1)
    B(2)
    T()
    f(1)
    Before
    T()
    f(1)
    After
    f2(1)原因:
    被声明为静态的方法在第一次new这个含有静态方法的类之时(或者直接使用ClassName.StaticMethod()之时),会被首先调用且仅调用一次。
    然后是Class内部非静态成员的初始化,然后调用Class的构造函数。上面的答案已经很显而易见了。
      

  6.   

    这是java初始化的问题,建议多看看书