在Java中,类的初始化和对象的创建遵循一定的顺序和规则。你已经提到了一些基本原则,这里我将通过一个示例来展示这些规则是如何应用的。假设我们有两个类:`Parent`和`Child`,其中`Child`继承自`Parent`。
```java
class Parent {
static int pStatic = 1;
static { System.out.println("Parent static block"); }
int pNonStatic = 2;
{
System.out.println("Parent non-static block");
}
Parent() {
System.out.println("Parent constructor");
}
}
class Child extends Parent {
static int cStatic = 3;
static { System.out.println("Child static block"); }
int cNonStatic = 4;
{
System.out.println("Child non-static block");
}
Child() {
System.out.println("Child constructor");
}
}
public class Test {
public static void main(String[] args) {
Child c = new Child();
}
}
```
在这个示例中,我们定义了两个类,每个类都有静态变量、静态代码块、非静态变量和非静态代码块。以下是当创建`Child`类的实例时,初始化的顺序:
1. **父类静态变量初始化**:
- 输出:`Parent static block`
- 静态变量`pStatic`被初始化为1。
2. **父类静态代码块执行**:
- 输出:`Parent static block`
3. **子类静态变量初始化**:
- 输出:`Child static block`
- 静态变量`cStatic`被初始化为3。
4. **子类静态代码块执行**:
- 输出:`Child static block`
5. **父类非静态变量初始化**:
- 输出:`Parent non-static block`
- 非静态变量`pNonStatic`被初始化为2。
6. **父类非静态代码块执行**:
- 输出:`Parent non-static block`
7. **父类构造函数执行**:
- 输出:`Parent constructor`
8. **子类非静态变量初始化**:
- 输出:`Child non-static block`
- 非静态变量`cNonStatic`被初始化为4。
9. **子类非静态代码块执行**:
- 输出:`Child non-static block`
10. **子类构造函数执行**:
- 输出:`Child constructor`
总结输出顺序:
```
Parent static block
Parent static block
Child static block
Child static block
Parent non-static block
Parent constructor
Child non-static block
Child constructor
```
这个示例展示了Java中类和对象初始化的详细过程,包括静态和非静态变量的初始化、静态和非静态代码块的执行以及构造函数的调用。