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