关于static的一些小代码

来源:互联网 发布:elasticsearch mysql 编辑:程序博客网 时间:2024/04/30 12:13
public class TestStatic {    static int a=1;    static{        a=2;    }    static{        a=4;    }    public static void main(String[] args) {        a++;        System.out.println("a="+a);         ++a;        System.out.println(a);    }}

最近碰到这么一个题,代码见上,当时看见这个题略微有点懵逼,犯了两个错误,一开始以为静态代码块中的变量为局部变量,在主函数中a++,以为是先输出原值,然后再加1。所以当时也没多想认为输出结果为1。后来用程序跑了一遍,发现之前没有看清整个程序。

现总结一下static的一些用法:1. 被static修饰的是全局变量,不需要创建对象即可调用,在类加载时即可调用。2. 在static代码块中不能用this或者super关键字,因为这两者是根对象紧密关联的3. 被static修饰的函数不能直接调用非静态函数,除非在内部创建一个类的对象,反过来,非静态函数可以直接调用静态函数。

好了,现在我们看上面的代码就很简单了,首先声明了一个静态变量a,赋值为1,之后在两个静态代码块中分别赋值为2和4,之后在主函数主调用的是a++,这个a++操作本来就是先取原值然后再++,但是这里并没有a用来获取这个原值,所以这里已经隐藏的表示加了1,因此这里输出的a是5,第二次输出的是6。如果换成下面的代码,那么就完全不同了

public class TestStatic {    static int a=1;    static{        a=2;    }    static{        a=4;    }    public static void main(String[] args) {//      a++;//      System.out.println("a="+a); //5        a=a++;        System.out.println("a="+a);        ++a;        System.out.println(a);    }}

上面这种写法,就是a=a++,先获取了a的原值赋值a,然后a再加1,但是此时a+1已经没有任何用了,a的值此时就为4了,输出为4,之后++a,当然是先加1,所以变为5,输出为5,就是跟之前的程序做了稍微改动,结果大变,至此这类题就OK了,同样a=++a;这种写法也不会影响第二次输出的值。

对了,写到这里又想到static的另外一个经常碰到的问题,看下面两段代码,

public class TestStatic2 {     static{         System.out.println("静态代码块1");     }     {        System.out.println("普通代码块1");      }     public TestStatic2(){         System.out.println("构造1");     }}public class TestStatic3 extends TestStatic2 {     {            System.out.println("普通代码块2");          }     static{         System.out.println("静态代码块2");     }     public TestStatic3(){         System.out.println("构造2");     }     public static void main(String[] args) {         TestStatic3  t2=new TestStatic3();         TestStatic3  t3=new TestStatic3();    }}静态代码块1静态代码块2普通代码块1构造1普通代码块2构造2普通代码块1构造1普通代码块2构造2

我这里也不卖关子了,就是子类继承父类,静态代码块与普通代码块以及构造函数的先后执行顺序,总结一下:父类静态代码块—》子类静态块—》父类普通代码块—》父类构造函数—-》子类普通代码块—》子类构造函数。 因为静态代码块只在类加载时的时候调用,所以只调用一次,主要用来初始化全局变量,而普通代码块主要是用来初始化成员变量,是先于构造函数执行,每次创建对象的时候都会调用,所以这里创建了两个子类对象的时候,除了静态代码块执行一次,普通代码块和构造函数都各自执行两次。

暂时static的内容就想到这些,如果以后有新的想法再补充。以上。

0 0
原创粉丝点击