Java 初始化顺序
首先,我们先看一个例子:
class Parent {
static {
System.out.println("parent_static_{}");
}
public String a = getStrParent();
{
System.out.println("parent_{}");
}
public Parent() {
System.out.println("parent_construct");
}
public String getStrParent() {
System.out.println("parent_method");
return "Parent";
}
}
class Child extends Parent {
{
System.out.println("child_{}");
}
static {
System.out.println("child_static_{}");
}
String a = getStrChild();
public Child() {
System.out.println("Child_construct");
}
public String getStrChild() {
System.out.println("child_method");
return "Child";
}
}
public class MainClass {
int a;
{
System.out.println("Mainclass_{}");
}
static {
System.out.println("Mainclass_static_{}");
}
public MainClass() {
System.out.println("MainClass_construct");
}
public static void main(String[] args) {
Parent parent = new Child();
}
}
运行结果:
Mainclass_static_{}
parent_static_{}
child_static_{}
parent_method
parent_{}
parent_construct
child_{}
child_method
Child_construct
说明首先是包含
public static void main(String[] args)
函数的类中的静态块的初始化,然后是这个函数中的变量进行初始化。这里的Child 类继承Parent类,初始化的顺序是:父类的静态块-》子类的静态块-》父类的非静态块或非静态变量(这两种的等级相同,根据代码的先后顺序而定)-》父类的构造函数-》子类的非静态块或非静态变量(这两种的等级相同,根据代码的先后顺序而定)-》子类的构造函数
如果类中含有静态变量,那顺序又如何?这里,让我们再看一个例子
class Parent {
static {
System.out.println("parent_static_{}");
}
public String a = getStrParent();
{
System.out.println("parent_{}");
}
public Parent() {
System.out.println("parent_construct");
}
public static String getStrParent() {//
System.out.println("parent_method");
return "Parent";
}
}
class Child extends Parent {
{
System.out.println("child_{}");
}
static {
System.out.println("child_static_{}");
}
static String a = getStrChild();//定义了一个静态变量,并用函数给它初始化;
public Child() {
System.out.println("Child_construct");
}
public static String getStrChild() {//
System.out.println("child_static_method");
return "Child";
}
}
public class MainClass {
int a;
{
System.out.println("Mainclass_{}");
}
static {
System.out.println("Mainclass_static_{}");
}
public MainClass() {
System.out.println("MainClass_construct");
}
public static void main(String[] args) {
Parent parent = new Child();
}
}
运行结果:
Mainclass_static_{}
parent_static_{}
child_static_{}
child_static_method
parent_method
parent_{}
parent_construct
child_{}
Child_construct
以上的运行结果中:child_static_method是由于定义了静态变量而又调用了函数给它初始化输出的。说明静态的变量的初始化和静态的块应该是一个优先级的。
综上,Java 初始化顺序如下:
首先是包含
public static void main(String[] args)
函数的类中的静态块的初始化,然后是这个函数中的变量进行初始化。这里的Child 类继承Parent类,初始化的顺序是:父类的静态块或静态变量(这两种的等级相同,根据代码的先后顺序而定)-》子类的静态块或静态变量(这两种的等级相同,根据代码的先后顺序而定)-》父类的非静态块或非静态变量(这两种的等级相同,根据代码的先后顺序而定)-》父类的构造函数-》子类的非静态块或非静态变量(这两种的等级相同,根据代码的先后顺序而定)-》子类的构造函数