关于static的一些小代码

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
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梦岚如雪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值