java 静态代码块_java的静态代码块和构造代码块

java中的类,不仅有函数,还有代码块。

而所谓的静态变量(类变量),和成员变量都是代码块的一部分。

并且有两种代码块。

静态代码块:

static{

int a = 5;

int b = 6;

}

构造代码块:

{

int c = 7;

int d = 8;

}

而静态变量的写法:

static int a = 5;

成员变量的写法:

int b = 6;

块写法除了不能加访问权限修饰符以外(因为是局部变量不存在修饰的概念),看起来和直接写没有区别。

不过,写在块里的变量声明实际上是声明了一个局部变量,而不是类变量或是对象的成员变量!!!

因此在块内声明和在块外声明完全是两回事!!!

不过因为一般来讲,代码块是为了赋值,而变量的声明一般写在外面(就可以写修饰符),就比如:

protected int a;

private int c;

{

a = 7;

c = -1;

}

静态块和构造块,这两者从写法上看只是差了一个static关键字而已,但是运行时的原理却完全不同。

我们知道,带有static关键字的变量属于类,而不带static关键字的变量属于对象。

因此

它们的运行方式有很大的不同,由于static属于类,所以在类初始化的时候会执行静态块的内容,而执行顺序就是静态块书写的顺序,并且由于类的初始化只有一次,静态块的执行也只有一次!

构造快则有不同了,每次调用对象的构造函数(任何形式的构造函数,这里其实就是有参构造和无参构造),就会运行构造块,并且实际运行中,构造块实际是放在任意的构造函数的函数体的最前方运行。

静态块和构造块例子:

public class TestMain {

static {

System.out.println("我是静态块!");

}

{

System.out.println("我是构造块1");

}

public static void main(String[] args) {

new TestMain();

System.out.println("分隔线..............................................");

new TestMain();

}

{

System.out.println("我是构造块2");

}

}

输出结果为:

我是静态块!

我是构造块1

我是构造块2

分隔线..............................................

我是构造块1

我是构造块2

可以发现,调用几次构造函数就执行几次构造块,并且执行顺序是把不同构造块按照书写顺序合并后放入构造函数体的最前方。而静态块则只执行了一次,因为类只会初始化一次!

最后讲一个比较神奇的事情,如果不用构造块,那么变量的赋值必须写在变量声明之前!否则是错的,也就是说

c = 6;

int c;

这样写是错的,然而使用了构造块,事情就不同了

{

c = 6;

}

int c;

这样就对了,之前说过,构造块实际上在运行时,是把里面的内容放在任意构造函数体的最前方,所以实际上构造块中的赋值实在构造函数中赋值!这样就可以理解了!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值