• 静态变量(初始化块);实例变量(代码块);构造方法;


    我们大家都知道,对于静态变量、静态初始化块、变量、初始化块、构造器,它们的初始化顺序以此是(静态变量、静态初始化块)>(变量、初始化块)>构造器。我们也可以通过下面的测试代码来验证这一点: 
    Java代码 
    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(); 



    运行以上代码,我们会得到如下的输出结果: 

    静态变量 
    静态初始化块 
    变量 
    初始化块 
    构造器 

    这与上文中说的完全符合。那么对于继承情况下又会怎样呢?我们仍然以一段测试代码来获取最终结果: 
    Java代码 
    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("父类--构造器"); 



    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(); 



    运行一下上面的代码,结果马上呈现在我们的眼前: 

    父类--静态变量 
    父类--静态初始化块 
    子类--静态变量 
    子类--静态初始化块 
    父类--变量 
    父类--初始化块 
    父类--构造器 
    子类--变量 
    子类--初始化块 
    子类--构造器 

    现在,结果已经不言自明了。大家可能会注意到一点,那就是,并不是父类完全初始化完毕后才进行子类的初始化,实际上子类的静态变量和静态初始化块的初始化是在父类的变量、初始化块和构造器初始化之前就完成了。 

    那么对于静态变量和静态初始化块之间、变量和初始化块之间的先后顺序又是怎样呢?是否静态变量总是先于静态初始化块,变量总是先于初始化块就被初始化了呢?实际上这取决于它们在类中出现的先后顺序。我们以静态变量和静态初始化块为例来进行说明。 

    同样,我们还是写一个类来进行测试: 
    Java代码 
    public class TestOrder { 
    // 静态变量 
    public static TestA a = new TestA(); 

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


    // 静态变量 
    public static TestB b = new TestB(); 

    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"); 



    运行上面的代码,会得到如下的结果: 

    Test--A 
    静态初始化块 
    Test--B 

    大家可以随意改变变量a、变量b以及静态初始化块的前后位置,就会发现输出结果随着它们在类中出现的前后顺序而改变,这就说明静态变量和静态初始化块是依照他们在类中的定义顺序进行初始化的。同样,变量和初始化块也遵循这个规律。
  • 相关阅读:
    在页面跳转的时候,在跳转后的页面中使用js 获取到 页面跳转的url中携带的参数。
    使用js处理后台返回的Date类型的数据
    java后端时间处理工具类,返回 "XXX 前" 的字符串
    前端分页神器,jquery grid的使用(前后端联调),让分页变得更简单。
    后端分页神器,mybatis pagehelper 在SSM与springboot项目中的使用
    使用SSM 或者 springboot +mybatis时,对数据库的认证信息(用户名,密码)进行加密。
    swagger2 常用注解的使用
    SSM项目 以及 springboot 中引入swagger2的方法
    jquery grid 获取选中的行的数据,以及获取所有行的方法
    关于使用ssm与spring时,配置tomcat 虚拟目录( doBase )中的一些坑
  • 原文地址:https://www.cnblogs.com/yldf/p/6249879.html
Copyright © 2020-2023  润新知