Java 初始化顺序

来源:互联网 发布:linux显示时间命令 编辑:程序博客网 时间:2024/06/12 00:17

首先,我们先看一个例子:

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类,初始化的顺序是:父类的静态块或静态变量(这两种的等级相同,根据代码的先后顺序而定)-》子类的静态块或静态变量(这两种的等级相同,根据代码的先后顺序而定)-》父类的非静态块或非静态变量(这两种的等级相同,根据代码的先后顺序而定)-》父类的构造函数-》子类的非静态块或非静态变量(这两种的等级相同,根据代码的先后顺序而定)-》子类的构造函数


1 0