日期:2014-05-20 浏览次数:20749 次
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方法执行前会加载所有的静态代码,并且只加载一次。
------解决方案--------------------