以下程序
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)
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)
static //1
{
b1 = new B(1);
}
static B b2 = new B(2); //2
在这个过程中,T里面又会对b1,b2进行初始化,然后才会执行T的构造函数,最后main方法执行,然而static变量只会被初始化一次,所以main方法里面的new T()不会对b1,b2进行初始化而是直接调用构造函数
B(1)
B(2)
T()
f(1)
before
T()
T(1)--------------------应该是f1(1)
after
f2(1)
B(1)
B(2)
T()
f(1)
Before
T()
f(1)
After
f2(1)原因:
被声明为静态的方法在第一次new这个含有静态方法的类之时(或者直接使用ClassName.StaticMethod()之时),会被首先调用且仅调用一次。
然后是Class内部非静态成员的初始化,然后调用Class的构造函数。上面的答案已经很显而易见了。