手机
当前位置:查字典教程网 >编程开发 >Java >浅谈Java变量的初始化顺序详解
浅谈Java变量的初始化顺序详解
摘要:规则1(无继承情况下):对于静态变量、静态初始化块、变量、初始化块、构造器,它们的初始化顺序依次是(静态变量、静态初始化块)>(变量、初始化...

规则1(无继承情况下):

对于静态变量、静态初始化块、变量、初始化块、构造器,它们的初始化顺序依次是

(静态变量、静态初始化块)>(变量、初始化块)>构造器

证明代码:

复制代码 代码如下:

public class InitialOrderTest {

// 静态变量

public static String staticField = "静态变量";

// 变量

public String field = "变量";

// 静态初始化块

static {

System.out.println(staticField);

System.out.println("静态初始化块");

}

// 初始化块

{

System.out.println(field);

System.out.println("初始化块");

}

// 构造器

public InitialOrderTest() {

System.out.println("构造器");

}

public static void main(String[] args) {

new InitialOrderTest();

}

}

结果显示:

静态变量

静态初始化块

变量

初始化块

构造器

规则2(有继承情况下):

子类的静态变量和静态初始化块的初始化是在父类的变量、初始化块和构造器初始化之前就完成

复制代码 代码如下:

class Parent {

// 静态变量

public static String p_StaticField = "父类--静态变量";

// 变量

public String p_Field = "父类--变量";

// 静态初始化块

static {

System.out.println(p_StaticField);

System.out.println("父类--静态初始化块");

}

// 初始化块

{

System.out.println(p_Field);

System.out.println("父类--初始化块");

}

// 构造器

public Parent() {

System.out.println("父类--构造器");

}

}//如果你想把这两个类放在同一个文件且名字起为SubClass, 父类前不能加public

public class SubClass extends Parent {

// 静态变量

public static String s_StaticField = "子类--静态变量";

// 变量

public String s_Field = "子类--变量";

// 静态初始化块

static {

System.out.println(s_StaticField);

System.out.println("子类--静态初始化块");

}

// 初始化块

{

System.out.println(s_Field);

System.out.println("子类--初始化块");

}

// 构造器

public SubClass() {

System.out.println("子类--构造器");

}

// 程序入口

public static void main(String[] args) {

new SubClass();

}

}

结果显示:

父类--静态变量

父类--静态初始化块

子类--静态变量

子类--静态初始化块

父类--变量

父类--初始化块

父类--构造器

子类--变量

子类--初始化块

子类--构造器

规则2(静态变量和静态初始化块):

静态变量和静态初始化块是依照他们在类中的定义顺序进行初始化的。同样,变量和初

始化块也遵循这个规律。

复制代码 代码如下:

public class testOrder {

// 静态变量

public static TestA a = new TestA();

public TestC c = new TestC();

// 静态变量

public static TestB b = new TestB();

public testOrder(){

System.out.println("in constract");

}

// 静态初始化块

static {

System.out.println("静态初始化块");

}

public static void main(String[] args) {

new testOrder();

}

}

class TestA {

public TestA() {

System.out.println("Test--A");

}

}

class TestB {

public TestB() {

System.out.println("Test--B");

}

}

class TestC {

public TestC() {

System.out.println("Test--C");

}

}

结果显示:

Test--A

Test--B

静态初始化块

Test--C

in constract

个人总结:

先静后动,先父后子,从上到下,先变量后构造

【浅谈Java变量的初始化顺序详解】相关文章:

Java反射机制的实现详解

深入分析Java内存区域的使用详解

Java中List与Map初始化的一些写法分享

浅析java的foreach循环

浅析java中print和println的区别

java 抽象类和接口的区别详细解析

Java多线程的用法详解

在Java中自由块的执行顺序

Java动态代理的应用详解

深入java内存查看与分析详解

精品推荐
分类导航