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

叫个鸭子官方

叫个鸭子官方

2016-02-19 09:27

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

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

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

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

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

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

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/bianchengyuyan/)
展开更多 50%)
分享

猜你喜欢

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

编程语言 网络编程
浅谈Java变量的初始化顺序详解

Java对象初始化顺序的使用

编程语言 网络编程
Java对象初始化顺序的使用

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

Java类变量和成员变量初始化过程的应用介绍

编程语言 网络编程
Java类变量和成员变量初始化过程的应用介绍

深入理解final变量的初始化

编程语言 网络编程
深入理解final变量的初始化

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

java父类和子类初始化顺序的深入理解

编程语言 网络编程
java父类和子类初始化顺序的深入理解

Java数组声明、创建、初始化基础

编程语言 网络编程
Java数组声明、创建、初始化基础

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

ECMAScript 基础知识

ECMAScript 基础知识

innertext , insertadjacentelement , insertadjacenthtml , insertadjacenttext 等区别

innertext , insertadjacentelement , insertadjacenthtml , insertadjacenttext 等区别
下拉加载更多内容 ↓