关于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的内容就想到这些,如果以后有新的想法再补充。以上。
- 关于static的一些小代码
- 关于static ,const 的一些小回顾
- 关于static的一些认识
- 关于static的一些理解
- **static 的作用以及一些小细节**
- 关于static初始化的小例子
- 关于java中Static的一些思考
- 关于c语言static的一些细节
- 关于 final static 的一些说话
- 关于函数名前加static的一些解释
- 关于public,static的一些总结
- 关于static关键字的一些学习
- 一些有用的小代码
- 【积累】一些小的代码
- 关于static代码块的初始化问题:
- 代码中关于static的作用
- 关于数据处理的一些代码
- 关于代码的一些思考
- JS中Float类型加减乘除
- 神经网络:多层网络与C++实现
- C# 控制台简单日历
- 软件测试——电话账单收费
- 大数据工程师(开发)面试系列(4)
- 关于static的一些小代码
- sql中表级约束和列级约束
- Android Studio Checkout Github Error “CreateProcess=2” (Windows)
- zookeeper如何实现负载均衡的?(具体连接哪一个zookeeper服务器的选择?)
- 那些年,我使用过的轮子(二)--memcached+couchbased
- 蓝桥杯2016-2生日蜡烛
- Java 函数
- Hi3516A/Hi3516D SDK 安装以及升级使用说明
- 初识 版本控制 git