`

zz java 类初始化顺序

    博客分类:
  • Java
 
阅读更多
zz from http://ig2net.info/archives/321.html

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

这也不要太纠结。
下面的写法会产生递归。
public class A
{
static{
a = new A("static block");
}
final static A a;
static A aa = new A("static init");
// A ma = new A("inner init");//这里在实例化变量时又实例自己的对象,递归
{
new A("inner block");//这里在实例化变量时又实例自己的对象,递归
}
public A()
{
// TODO Auto-generated constructor stub
}
public A(String i)
{
System.out.println(i);
}
public static void main(String[] args)
{

}
}

这里顺便温习一下构造函数的继承问题:

创建一个子类的对象实例的时候,必先调用父类的无参数的构造函数(默认构造函数),假如父类有带参数的构造函数,那么系统将不会给它创建无参数的构造函数,这时,子类在实例化的时候,因为找不到父类的默认构造函数,编译器将会报错,但如果在子类的构造函数中指定用父类的带参数的构造函数的时候,或者在父类中加一个无参数的构造函数,就不会报错。
分享到:
评论

相关推荐

    (zz)java集合类总结

    - **Arrays.fill()**:用于填充数组,可以方便地初始化数组。 - **Collections.reverse()**:反转列表中的元素顺序。 - **Collections.sort()**:对列表进行排序,支持自定义比较规则。 - **Arrays.sort()**:对数组...

    利用 First Fit 算法解决物流3D bin packing问题 Java实现

    - 初始化一个空箱子列表,用于存放箱子对象。 - 根据物品列表,按体积升序排序,以便先尝试小体积物品。 3. **算法流程**: - 对于每个物品: - 遍历所有箱子,按顺序检查每个箱子是否能容纳该物品。 - 如果...

    利用 Best Fit 算法解决物流3D bin packing问题 Java实现

    1. 初始化:创建一个空箱子列表,每个箱子具有长、宽、高的属性。 2. 对每个待装物体,计算其体积(物体的长×宽×高)。 3. 遍历箱子列表,找到第一个能容纳该物体且剩余空间最小的箱子,如果找不到,创建一个新的...

    java实现logistic回归算法

    在Java中,你可以先定义一个数据类,然后创建一个LogisticRegression类,包含初始化、训练、预测等方法。训练过程中,你需要实现梯度上升法或优化算法,每次迭代更新权重。预测时,使用Sigmoid函数计算概率并根据...

    JAVA源码用Java加密类实现DES,RSA及SHA的加密算法

    3. **初始化Cipher对象**:根据密钥初始化`Cipher`对象,并设置为加密或解密模式。 4. **加密与解密操作**:通过`Cipher`对象的`doFinal()`方法完成数据的加密与解密。 #### 二、RSA(Rivest–Shamir–Adleman)...

    java面试题目20页可已打印题目含解析和答案

    这个问题涉及到Java中的`Calendar`类和`SimpleDateFormat`类。`Calendar`类用于处理日期和时间,当设置的日期超出了月份的天数,如2月的32日,系统会自动转到下个月的第一天,所以输出应该是3月1日,答案是B。 2. ...

    java源代码

    `4zz`可能涉及到数组的使用,学习如何创建、初始化和遍历数组。`2zz`可能涉及条件语句和逻辑运算,讲解如何根据条件执行不同的代码块。 中级阶段的源代码将更深入,可能会涵盖异常处理、多线程、集合框架、IO流、...

    深入Java核心 Java内存分配原理精讲

    ### 深入Java核心:Java内存分配原理精讲 #### 一、Java内存区域概述 在Java程序运行过程中,其内存主要分为...它不仅能帮助我们更好地掌握Java语言的本质,还能有效避免因内存问题导致的性能瓶颈或系统崩溃等问题。

    android应用源码zz-doctor中医大夫助理信息系统源码.zip

    例如,`MainActivity.java`可能是主活动的实现,包含`onCreate()`方法用于初始化界面,以及其他回调方法如`onClick()`处理按钮点击事件。 3. **数据存储**:在zz-doctor应用中,可能涉及到数据库操作,如SQLite,...

    FizzBu​​zz_GeneralCase:包含针对JAVA中的FizzBu​​zz问题的通用版本的解决方案

    这段代码通过一个for循环遍历1到N的整数,每次迭代时,先初始化一个空字符串`output`用于存储当前数字的输出结果。接着,我们分别检查数字是否能被3和5整除,如果满足条件则在`output`中添加相应的字符串。最后,...

    新手入门写Java程序的三十个基本规则

    - 初始化块可以用来设置初始值或执行某些初始化操作。 #### 18. 接口与抽象类 - 接口用于定义行为标准,而抽象类则提供了部分实现。 - 根据实际需求选择使用接口还是抽象类。 #### 19. 数据一致性 - 确保数据的...

    隐马尔可夫模型中的Viterbi算法zz

    通常,这个类可能会包含初始化概率数组,动态规划计算,以及回溯路径的函数。通过阅读源码,我们可以更深入地理解算法的细节,包括如何处理边界条件,优化内存使用,以及如何处理实际数据结构。不过,由于具体源码...

    java代码-写一个程序,从输入的字符串中,截取出最长数字串,并打印出来。 例如:输入"abcd12345你好125**123456789ZZ",输出"123456789"

    2. 在方法内部,初始化两个变量,`currentNumber`用于存储当前遍历到的数字子串,`longestNumber`用于存储目前为止找到的最长数字子串。 3. 使用一个循环遍历输入字符串的每个字符。 4. 对于每个字符,检查它是否为...

    JAVA源码最短路径算法实现k-shortest-paths

    - **初始化**:创建一个空的优先队列用于存储待处理的路径,并将起点到自身的初始路径加入队列。 - **迭代过程**: - 从优先队列中取出当前最短路径。 - 将该路径的终点设为新的起点,探索其所有邻接顶点。 - ...

    请求分页存储管理系统的设计与实现.rar

    在此次实训过程中,我先是完成了FIFO、LRU、OPT、Clock四个算法的实现,之后结合Java的Swing图形化界面,将算法融入到图形化界面中,并且可以进行序列长度和运行时间的初始化,紧接着,可以将序列和物理块进行随机...

    dhtmlx-grid分页-示例,后台java调用

    初始化列表 initGrid ; } ; window dhx globalImgPath "${ctx} images public "; 初始化列表 function initGrid { showSkyLoading "数据加载中 请稍候 " ; mygrid new ...

    android地图兴趣点marker聚合demo

    1. **初始化地图**: 首先需要在Activity中设置地图容器,并通过`AMap`类初始化地图,设置地图类型、比例尺等属性。 ```java MapView mapView = findViewById(R.id.map_view); mapView.onCreate(savedInstanceState)...

    Spring源码出错,缺失cglib.3.2.6 与 objenesis.2.6

    Objenesis则是另一个Java库,它主要用于实例化未被初始化的类,即使这些类没有无参数构造函数。在Spring框架中,Objenesis用于AOP代理的创建,特别是在CGLIB中,当需要创建一个实例而没有合适的构造函数时,...

Global site tag (gtag.js) - Google Analytics