日期:2014-05-20 浏览次数:20992 次
class Cup{
Cup(int marker){
System.out.println("Cup("+marker+")");
}
void f(int marker){
System.out.println("f("+marker+")");
}
}
class Cups{
static Cup c1;
static Cup c2;
static {
System.out.println("c1 = new Cup(1)");
c1 = new Cup(1);
System.out.println("c1 = new Cup(2)");
c2 = new Cup(2);
}
Cups(){
System.out.println("Cups()");
}
}
public class ExplicitStatic {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("Inside main()");
Cups.c1.f(99);
}
static Cups x = new Cups();
static Cups y = new Cups();
}
输出结果。。
c1 = new Cup(1)
Cup(1)
c1 = new Cup(2)
Cup(2)
Cups()
Cups()
Inside main()
f(99)
静态块先初始化吧。。多加几个system.out就看出来了。。
一起学习了。
------解决方案--------------------
程序在进入main方法之前会先加载所有有关的静态的东西,并且只加载一次
所有先会到这里
1.static Cups x = new Cups();
2.static Cups y = new Cups();
先加载上面的第第一步static Cups,这时候会加载Cups类,此时的Cups中也存在静态代码块,所有又去加载Cups中的静态代码,就会进入下面
3.static Cup c1;
4.static Cup c2;
5.static {
6.c1 = new Cup(1);
7.c2 = new Cup(2);
}
依次3,4,5,6到这来的时候就会new Cup(1),创建Cup对象,调用其被重载的构造方法,
Cup(int marker){
System.out.println("Cup("+marker+")");
}
打印Cup(1),
完成后进入第七步,跟上面一样,此时打印Cup(2)
此时Cups中的静态代码加载完毕,返回到第一步,此时new Cups(),调用cups()的构造方法
Cups(){
8.System.out.println("Cups()");
}
即进入第八步,打印Cups()
完成后进入第二步,static Cups y = new Cups();此时Cups中的静态代码在之前第一次已经加载过,所以不会再次加载,而是继续new Cups(),就又打印出Cups(),完成后进入main()方法
System.out.println("Inside main()");
Cups.c1.f(99);
打印Inside main()
然后调用Cups.c1.f(99),打印f(99)
所以结果是:
Cup(1)
Cup(2)
Cups()
Cups()
Inside main()
f(99)
主要的就是在main方法执行前会加载所有的静态代码,并且只加载一次。
------解决方案--------------------