浅谈Java变量的初始化顺序详解

2016-02-19 09:27 3 1 收藏

今天给大家分享的是由图老师小编精心为您推荐的浅谈Java变量的初始化顺序详解,喜欢的朋友可以分享一下,也算是给小编一份支持,大家都不容易啊!

【 tulaoshi.com - 编程语言 】

规则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();
    }
}

结果显示:
静态变量
静态初始化块
变量
初始化块
构造器

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/bianchengyuyan/)

规则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

个人总结:
先静后动,先父后子,从上到下,先变量后构造

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/bianchengyuyan/)

来源:https://www.tulaoshi.com/n/20160219/1590864.html

延伸阅读
ALTER DATABASE DATAFILEd:\ORANT\DATABASE\USER1ORCL.ORA RESIZE 1000M; CREATE TABLESPACE INDEX_DATA DATAFILEd:\ORANT\DATABASE\INDEX_DATA SIZE 500M; ALTER DATABASE DATAFILEd:\ORANT\DATABASE\RBS1ORCL.ORA RESIZE 300M; ALTER DATABASE DATAFILEd:\ORANT\DASTABASE\TMP1ORCL.ORA RESIZE 300M; alter rollback segment "RB1" offlin...
问题:        C++中如何初始化类中的表数据?在C语言中,我能像下面这样初始化结构数组:  // strUCt MYSTRUCT {     int x,y,z; };MYSTRUCT table[] = {     { 1,2,3 },     { 4,5,6 },     .....
  全部引导过程是四步 1:boot PROM phase 2:boot Programs phase 3:kernel initialization phase 4:init phase system初始化,检测内存和cpu,检查设备和创建设备树,设置console kernel初始化过程 kernel self -initialization 内核自检 loading of kernel modules 载入内核模块 rea...
《耻辱》初始化失败的解决方法 我想一定有很多人安装了最新的DLC后,打开游戏就弹出对话框,初始化失败吧,下面来介绍下解决办法: 如果用的是汉化贴里面那个R组全套+2DLC+9.0,并且是是XP系统,而且怎么弄也弄不进去,出现oxc0000142(初始化失败) 。 其实是破解的问题,R组的补丁不支持XP系统。 重新找个升级档破解补丁,复制到 Dishon...
代码如下: class Parent {     // 静态变量     public static String p_StaticField = "父类--静态变量";     // 变量(其实这用对象更好能体同这一点,如专门写一个类的实例)     //如果这个变量放在初始化块的后面,是会报错的,因为你根本没有被初始化   &nbs...

经验教程

797

收藏

12
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部