static关键字后面的代码与其他静态初始化动作一样,这段代码只会执行一次;当首次生成这个类的一个对象的时候,或者首次访问属于这个类的静态数据成员的时候或者静态成员方法时候都会去执行static里面的代码。
package com.test.init;
public class ExplicitStatic {
public static void main(String[] args) {
System.out.println("Inside main()");
Cups.cup1.f(99);//1
Cups.ff();//2
}
//static Cups cups1=new Cups(); //3
//static Cups cups2=new Cups(); //3
}
class Cup{
Cup(int marker){
System.out.println("Cup " +marker);
}
void f(int marker) {
System.out.println("f "+marker);
}
}
class Cups{
static Cup cup1;
static Cup cup2;
static {
System.out.println("cup1 "+cup1);
System.out.println("cup2 "+cup2);
cup1=new Cup(1);
cup2=new Cup(2);
}
Cups(){
System.out.println("Cups()");
}
static void ff() {
System.out.println("Cups ff");
}
}
1、如果1,2注释放开,3注释掉结果显示为
Inside main()
cup1 null
cup2 null
Cup 1
Cup 2
f 99
Cups ff
可以看到static里面的代码只执行了一次。
2、如果把2,3注释掉1放开结果显示为
Inside main()
cup1 null
cup2 null
Cup 1
Cup 2
f 99
3、如果把1,3注释掉2放开结果显示为
Inside main()
cup1 null
cup2 null
Cup 1
Cup 2
Cups ff
4、1、2、3都注释掉结果
Inside main()
5、1、2注释,3放开结果
cup1 null
cup2 null
Cup 1
Cup 2
Cups()
Inside main()
可以看到ExplicitStatic里面先去执行了成员变量的初始化
static Cups cups1=new Cups(),创建Cups类时,首先也会默认执行
static Cup cup1;
static Cup cup2;的初始化,然后执行static里面的代码。