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

时间:2023-07-26 03:23:17 

规则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,变量,初始化顺序
0
投稿

猜你喜欢

  • C语言实现简单的三子棋小游戏

    2022-04-26 04:17:26
  • C#/VB.NET实现创建PDF/UA文件的示例代码

    2023-05-02 23:31:51
  • Android OkHttp实现全局过期token自动刷新示例

    2023-01-24 10:31:57
  • Java之BigDecimal的坑及解决

    2022-05-17 01:09:01
  • Android 快速实现防止网络重复请求&按钮重复点击的方法

    2023-08-29 17:31:45
  • java oshi如何查看cpu信息

    2023-01-06 21:16:39
  • Java线程的start方法回调run方法的操作技巧

    2023-11-11 06:02:00
  • android和服务器的URLEncodedUtils乱码编码问题的解决方案

    2021-11-19 08:13:12
  • C#中Web.Config加密与解密的方法

    2022-11-25 05:31:06
  • Jsoup解析html实现招聘信息查询功能

    2022-01-08 19:38:07
  • java实现手写一个简单版的线程池

    2022-09-29 04:59:32
  • 使用java实现猜拳小游戏

    2023-11-25 17:30:16
  • Java Web实现session过期后自动跳转到登陆页功能【基于过滤器】

    2021-08-19 03:44:37
  • Java应用开源框架实现简易web搜索引擎

    2023-08-22 20:20:54
  • C# StreamReader类实现读取文件的方法

    2023-06-20 13:02:00
  • Java(基于Struts2) 分页实现代码

    2023-11-04 05:58:58
  • Android 动画实现几种方案

    2022-08-31 02:57:39
  • C#获取指定目录下指定文件的方法

    2022-11-01 12:34:27
  • Android WebView使用方法详解 附js交互调用方法

    2021-09-11 20:26:42
  • 详解利用Spring加载Properties配置文件

    2023-04-04 20:53:13
  • asp之家 软件编程 m.aspxhome.com