代码块
,即被{
}
包裹的一块代码.
就像这样,
{
... //代码块
}
代码块被分为3类:
1.局部代码块
2.构造代码块
3.静态代码块
下面来细说各代码块的相关定义:
1.局部代码块
局部代码块位于函数内部,变量仅作用于代码块中!
例如:
public static void main(String[] args){
{
int i = 0; //代码块
}
System.out.println(i);
}
结果:
错误: 找不到符号
System.out.println(i);
^
符号: 变量 i
位置: 类
1 个错误
原因:代码块中的变量仅作用于代码块中!
2.构造代码块
构造代码块位于类中,也是类的成员,与成员变量和成员函数同级.
在构造对象时,先调用构造代码块,然后是构造函数.
例如:
class Car{
String color;
{
System.out.println("构造代码块");
}
Car(String color){
System.out.println("构造函数");
this.color=color;
}
}
class CodeBlock{
public static void main(String[] args){
Car car = new Car("red"); //构造一个对象
}
}
结果:
构造代码块
构造函数
原因:构造代码块优先于构造函数执行代码!
3.静态代码块
静态代码块就是构造代码块前加static
修饰符.
它的执行是在类加载的时候执行,并且只执行一次.
定义类类型变量时不加载.
例如:
class Car{
String color;
static{
System.out.println("静态代码块");
}
Car(String color){
System.out.println("构造函数");
this.color=color;
}
}
class CodeBlock{
public static void main(String[] args){
Car car;
System.out.println("定义car变量");
car = new Car("red");
car = new Car("red");
car = new Car("red");
car = new Car("red"); //多次构造对象
}
}
结果:
定义car变量
静态代码块
构造函数
构造函数
构造函数
原因:
1.定义car变量不会加载类
2.静态代码块在加载类(构造对象前)执行
3.构造函数在构造对象时执行
补充
手动控制类加载,使用Class.forName(String classname),默认加载类时执行静态代码块
重载Class.forName(String,boolean initialize,currentLoader),可以控制加载时是否初始化。
将上段代码中的main方法改变一下,
class CodeBlock{
public static void main(String[] args)throws Exception{
Car car;
Class.forName("Car",true,CodeBlock.class.getClassLoader());
System.out.println("定义car变量");
car = new Car("red");
car = new Car("red");
car = new Car("red");
}
}
结果:
静态代码块
定义car变量
构造函数
构造函数
构造函数
将上段代码中的main方法再改变一下,
class CodeBlock{
public static void main(String[] args)throws Exception{
Car car;
Class.forName("Car",false,CodeBlock.class.getClassLoader());
System.out.println("定义car变量");
car = new Car("red");
car = new Car("red");
car = new Car("red");
}
}
结果:
定义car变量
静态代码块
构造函数
构造函数
构造函数