- 在Java中,一个类包含静态变量、静态初始化块、变量、初始化块、构造器,它们初始化的顺序依次是(静态变量、静态初始化块) --> (变量、初始化块) --> 构造器。
public class Test {
//静态变量
public static String strStatic = "静态变量";
//变量
public String strPublic = "变量";
//静态初始化块
static {
System.out.println(strStatic);
System.out.println("静态初始化块");
}
//初始化块
{
System.out.println(strPublic);
System.out.println("初始化块");
}
//构造器
public Test() {
System.out.println("构造器");
}
public static void main(String[] args) {
new StaticTest();
}
}
以上代码运行结果:
静态变量
静态初始化块
变量
初始化块
构造器
2.在Java中,当子类继承父类后当子类初始化时,首先会初始化父类相应的变量或初始化块,如下代码
class Parent {
public static String strParent = "父 --> 静态变量";
public String strParentPublic = "父 --> 变量";
static {
System.out.println(strParent);
System.out.println("父 --> 静态初始化块");
}
{
System.out.println(strParentPublic);
System.out.println("父 --> 初始化块");
}
}
class Child extends Parent {
// 静态变量
public static String strStatic = "子 --> 静态变量";
// 变量
public String strPublic = "子 --> 变量";
// 静态初始化块
static {
System.out.println(strStatic);
System.out.println("子 --> 静态初始化块");
}
// 初始化块
{
System.out.println(strPublic);
System.out.println("子 --> 初始化块");
}
}
该代码运行结果:
父 --> 静态变量
父 --> 静态初始化块
子 --> 静态变量
子 --> 静态初始化块
父 --> 变量
父 --> 初始化块
子 --> 变量
子 --> 初始化块
3.在Java中的各种静态变量和静态初始化块其实是没有固定初始化顺序的,它们初始化的顺序与它们被定义的顺序有关。当静态变量先定义静态初始化块后定义,那么在初始化时就会先初始化【静态变量】再初始化【静态初始化块】。具体代码如下:
public class StaticTest {
// 静态变量
public static TestChild child = new TestChild();
// 静态初始化块
static {
System.out.println("静态初始化块");
}
// 静态变量
public static TestParent parent = new TestParent();
public static void main(String[] args) {
new StaticTest();
System.out.println("==========================逗比分割线=========================");
new TestStatic();
}
}
class TestStatic {
public static TestParent parent = new TestParent();
public static TestChild child = new TestChild();
static {
System.out.println("TestStatic 的静态初始化块");
}
}
class TestParent {
public TestParent() {
System.out.println("Test --> Parent");
}
}
class TestChild{
public TestChild() {
System.out.println("Test --> Child");
}
}
上述代码运行结果:
Test --> Child
静态初始化块
Test --> Parent
==========================逗比分割线=========================
Test --> Parent
Test --> Child
TestStatic 的静态初始化块