Java中静态块和构造块
构造块(Instance Initializer Block)和静态块(Static Initializer Block)在Java中用于不同的初始化场景。下面我将通过一些示例来展示它们的使用。
### 构造块的使用示例
构造块用于初始化实例变量,它在每个构造函数执行之前执行。以下是一个构造块的使用示例:
```java
public class Person {
String name;
int age;
// 构造块,用于初始化实例变量
{
name = "Unknown";
age = 0;
System.out.println("Instance initializer block executed.");
}
// 构造函数
public Person(String name, int age) {
this.name = name;
this.age = age;
System.out.println("Constructor executed.");
}
// 另一个构造函数
public Person() {
System.out.println("No-args constructor executed.");
}
public static void main(String[] args) {
Person person1 = new Person("Alice", 30);
Person person2 = new Person();
}
}
```
在这个例子中,无论使用哪个构造函数创建 `Person` 对象,构造块都会首先执行,初始化 `name` 和 `age` 为默认值。
### 静态块的使用示例
静态块用于初始化类变量,它在类第一次被加载到JVM时执行。以下是一个静态块的使用示例:
```java
public class MyClass {
static int staticCounter;
// 静态块,用于初始化静态变量
static {
staticCounter = 100;
System.out.println("Static initializer block executed.");
}
public MyClass() {
System.out.println("Constructor executed.");
}
public static void main(String[] args) {
MyClass myObject1 = new MyClass();
MyClass myObject2 = new MyClass();
System.out.println("Static counter value: " + MyClass.staticCounter);
}
}
```
在这个例子中,静态块在类第一次被加载时执行,初始化静态变量 `staticCounter`。无论创建多少个 `MyClass` 的实例,静态块都只执行一次。
### 构造块和静态块结合使用
```java
public class Employee {
static int employeeCount;
int id;
// 静态块
static {
employeeCount = 0;
System.out.println("Static block executed, employee count initialized.");
}
// 构造块
{
id = ++employeeCount;
System.out.println("Instance block executed, employee ID assigned: " + id);
}
// 构造函数
public Employee() {
System.out.println("Constructor executed.");
}
public static void main(String[] args) {
Employee emp1 = new Employee();
Employee emp2 = new Employee();
System.out.println("Total employees: " + Employee.employeeCount);
}
}
```
静态块里只能访问静态成员
在这个例子中,静态块用于初始化员工总数,而构造块用于为每个新创建的 `Employee` 对象分配一个唯一的ID。静态块在类第一次被加载时执行,构造块在每个对象创建时执行。
通过这些示例,你可以看到构造块和静态块在Java中初始化对象和类状态时的不同用途和时机。