为什么要用代码块
我们知道,java类中,不可以写操作语句,我们可以写:
public class demo{
int i = 0;
}
或者
public class demo{
int i;
}
但不可以写
public class demo{
int i;
i = 1
}
更不可以
public class demo{
int i;
i += 1;
}
(编译器会以为i是个类名
有时候,我们一开始不想给属性赋值,想在进行一些操作(可能是处理异常之类)之后,调用类的方法之前,对属性赋值。
这时候我们就要用到代码块。
代码块分类与特性
1、代码块分为静态代码块与非静态代码块
静态代码块在类加载的时候,执行其中的语句。因为类加载只有一次,所以静态代码块只执行一次。
非静态代码块在new该类的一个对象时,执行其中的语句。每次new一个类,执行一次非静态代码块中的代码。
2、对应静态属性与非静态属性
对照静态属性与非静态属性的性质,很容易能想到,静态属性由静态代码块来负责赋值,非静态属性由非静态代码块来负责赋值。
3、拓展:什么时候加载类呢?
首先加载的是程序入口main()方法所在的类,
之后,在main()方法中首次提到某个类时,加载该类。
4、拓展:属性可以赋值的位置与赋值先后
赋值的位置:
①默认赋值
②显式赋值
③构造器中赋值
④new对象之后,通过 对象.属性 的方式赋值
⑤代码块中赋值
赋值先后:
① -> ②/⑤ -> ③ -> ④
没想到吧,代码块写在属性声明的前后时有区别的!
{
id = 4
}
int id = 3
public static void main(){
System.out.println(id);
}
和
int id = 3
{
id = 4
}
public static void main(){
System.out.println(id);
}
结果不同!!!!!
具体实例
参考尚硅谷的一段获取数据库连接的代码:
可以先不用关注细节,可以看到静态属性dataSourse先被设为了null,之后进行了一堆操作之后,才对它赋值。
注意静态属性用静态代码块来赋值,且其中只能调用静态方法。