1.静态代码块
在类中,用static修饰的代码块叫做静态代码块,主要用于给类做初始化操作!
- 静态代码块特点:
-
静态代码块只能定义在类里面,独立于任何方法,不能定义在方法里面。
-
一个类中允许定义多个静态代码块,执行的顺序根据定义的顺序进行。
-
静态代码块中的变量都是局部变量,只能访问类的静态变量,而不允许访问成员变量。
-
静态代码块会在类被加载时自动执行,并且只执行一次!
- 静态代码块作用:
给静态变量赋初始值,实际开发中使用比较多,一般用于执行一些全局性的初始化操作。
例如:创建工厂、加载数据库初始信息等等
【示例】静态代码块示例
class StaticBlockDemo {
String name;
static String sex;
static {
// 只能访问类的静态变量,而不允许访问实例变量
// name = "小明"; 编译错误
sex = "男";
System.out.println("11");
}
}
2.构造代码块
在类中,没有用static修饰的代码块叫做构造代码块(非静态代码块),主要用于给所有对象共性特点进行初始化操作!
- 构造代码块特点:
-
构造代码块只能定义在类里面,独立于任何方法,不能定义在方法里面。
-
一个类中允许定义多个构造代码块,执行的顺序根据定义的顺序进行。
-
构造代码块中的变量都是局部变量,既可以访问静态变量也可以访问实例变量。
-
构造代码块随着对象的创建而加载,每创建对象一次就执行一次!
- 构造代码块作用:
可以将各个构造方法中公共的代码提取到构造代码块。
匿名内部类不能提供构造方法,此时初始化操作可以放到构造代码块中。
【示例】构造代码块
class BlockDemo {
String name;
static String sex;
{
// 可以访问静态变量也可以访问实例变量
name = "小明";
sex = "男";
}
}
3.代码执行顺序
静态代码块在非静态代码块之前执行(静态代码块—>非静态代码块—>构造方法)。是因为被static修饰的成员都是类成员,会随着JVM加载类的时候加载而执行,而没有被static修饰的成员也被称为实例成员,需要创建对象才会随之加载到堆内存。所以静态的会优先非静态的。
【示例】思考以下代码的执行顺序
class Person {
static int num;
static {
System.out.println("静态代码块执行 num:" + ++num);
}
{
System.out.println("构造代码块执行 num:" + ++num);
}
public Person() {
System.out.println("无参构造方法在执行 num:" + ++num);
}
public Person(int number) {
this();
System.out.println("有参构造方法在执行 num:" + ++num);
}
}
public class BlockDemo {
public static void main(String[] args) {
new Person(3);
new Person();
}
}
输出结果如下图所示:
思考:为什么会出现这样的结果???
ps:如需最新的免费文档资料和教学视频,请添加QQ群(627407545)领取。