`

Java初始化顺序总结 - 静态变量、静态代码块、成员变量、构造函数

 
阅读更多
Java初始化顺序(转来的)
1new B一个实例时首先要进行类的装载。(类只有在使用New调用创建的时候才会被java类装载器装入)
2,在装载类时,先装载父类A,再装载子类B
3
,装载父类A后,完成静态动作(包括静态代码和变量,它们的级别是相同的,安装代码中出现的顺序初始化)

4
,装载子类B后,完成静态动作
类装载完成,开始进行实例化
1
,在实例化子类B时,先要实例化父类A
2
,实例化父类A时,先成员实例化(非静态代码)

3
,父类A的构造方法
4
,子类B的成员实例化(非静态代码)
5
,子类B的构造方法

 

先初始化父类的静态代码--->初始化子类的静态代码-->初始化父类的非静态代码--->初始化父类构造函数--->初始化子类非静态代码--->初始化子类构造函数

 

测试代码:

abstract class base
{         
    public int age=getNumber(100);        
    static{         
        System.out.println("base static block");       
    }
       
    {          
        System.out.println("base nonstatic block");        
    }   
    static int sage=getNumber(50);   
    base(){       
        System.out.println(age);       
        System.out.println("base start");
        draw();//会调用子类覆盖后的方法,这儿是0!      
        System.out.println("base end");           
    }   
    static int getNumber(int base){       
        System.out.println("base.getNumber int"+base);
        return base;   
    }   
    public  void draw(){       
        System.out.println("base.draw");   
        }
}

public class initializeOrder extends base{   
    public int age=getNumber(1001);   
    private int _radius=getNumber(10);   
    static int sage=getNumber(250);   
    static{       
        System.out.println("subclass static block");   
    }   
    {       
        System.out.println("subclass nonstatic block"); 
    }
    initializeOrder(int radius){       
        _radius=radius;       
        System.out.println(age);
        draw();//这儿是1000
        System.out.println("initializeOrder initialized");   
    }   
    public void draw(){
        System.out.println("initializeOrder.draw "+_radius);   
        }     
    public static void main(String[] args) {        // TODO Auto-generated method stub      
        new initializeOrder(1000);   

    }

}

输出为:

base static block
base.getNumber int50
base.getNumber int250
subclass static block
base.getNumber int100
base nonstatic block
100
base start
initializeOrder.draw 0
base end
base.getNumber int1001
base.getNumber int10
subclass nonstatic block
1001
initializeOrder.draw 1000
initializeOrder initialized

分享到:
评论

相关推荐

    java 静态非静态 字段方法 子类父类构造_初始化顺序!

    java 静态_非静态 字段_方法_代码块 子类父类构造_初始化顺序! 三个class 让你清清楚楚 第一个class java代码如下: package initialOrder; class Parent { // 静态变量 public static String p_StaticField...

    构造函数与静态块的执行顺序

    静态块常用于初始化静态变量或执行一次性的初始化操作。 ### 继承中构造函数与静态块的执行顺序 在Java中,当一个类继承自另一个类时,实例化子类对象时构造函数与静态块的执行顺序遵循以下规则: 1. **静态块的...

    java类中静态域、块,非静态域、块,构造函数的初始化顺序

    - **静态块**:在类加载时执行的代码块,主要用于初始化静态域。 - **非静态块(实例初始化块)**:在每次创建类的新实例时执行的代码块,用于初始化非静态域。 - **构造函数**:用于初始化新创建的对象的方法。 ##...

    java代码的初始化顺序demo

    总之,Java代码的初始化顺序是类加载的必然过程,涉及到静态和实例初始化块、构造函数、成员变量初始化以及继承关系的影响。这个demo是学习和理解这些概念的重要工具,通过实际操作可以加深对Java内存管理和对象生命...

    Java静态初始化块和对象初始化块

    静态初始化块是以`static`关键字标识的代码块,它在类被加载到Java虚拟机(JVM)时执行,且只执行一次。静态初始化块常用于设置类级别的变量,或者执行只应执行一次的初始化操作。例如,如果一个类需要在程序运行前...

    Java的静态代码块、非静态代码块、构造函数

    总结来说,Java的静态代码块、非静态代码块和构造函数都是在不同阶段和目的下进行对象初始化的工具。理解并熟练运用这些概念,能够帮助开发者编写出更加高效和健壮的代码。在Java学习和开发过程中,掌握这些基础知识...

    Java变量初始化

    这一切都是在构造函数执行之前,变量的真正初始化是在构造函数中执行。 Java 变量初始化的时机 Java 变量初始化的时机可以分为两类:实例变量初始化和类变量初始化。 实例变量初始化 实例变量初始化可以在三个...

    C++全局变量初始化的一点总结

    动态初始化则涉及运行时的动作,比如需要函数调用或类构造函数的初始化。这些变量的初始化在main函数执行之前进行,但晚于静态初始化。这意味着如果一个全局变量依赖于其他全局变量的初始化结果,必须确保这些依赖的...

    Java语言基础入门教程 Java实训教程 4.类构造函数-this-静态属性方法-instanceof运算符共55页.pptx

    - 一种特殊的代码块,用于在类加载时初始化静态变量。 - 使用`static`关键字声明。 #### 五、`instanceof`运算符 `instanceof`是一个二元运算符,用于测试对象是否为特定类或其子类的实例。 - **基本语法**: -...

    学习java静态数据初始化.doc

    在 Java 中,静态变量的初始化过程可以被分为三个阶段:静态初始化、非静态初始化和执行构造函数。静态初始化是指在类加载时对静态变量的初始化。非静态初始化是指在实例创建时对实例变量的初始化。执行构造函数是指...

    C++和Java初始化顺序的比较代码

    2. 非静态数据成员:在构造函数初始化列表中,成员变量按照它们在类声明中的顺序被初始化。即使初始化列表中的顺序不同,也会按照声明的顺序进行。 例如: ```cpp class MyClass { public: int a; int b; static...

    java中类的初始化顺序

    类的初始化涉及到多个方面,包括静态成员变量、实例成员变量、静态初始化块、实例初始化块以及构造函数等。本文将详细探讨Java中类的初始化过程及其顺序,并通过具体的代码示例来帮助理解这一过程。 #### 二、基础...

    Java中static静态变量的初始化完全解析

    `B`类的`plus`变量也会被初始化,导致`A`类的构造函数执行,进一步影响`A`类的静态变量。这个过程会导致一些复杂的交互,需要仔细分析代码来确定确切的顺序和值。 总的来说,理解Java中静态变量的初始化顺序对于...

    类继承的初始化顺序类,继承的初始化顺序

    3. **基类非静态成员初始化**:当创建一个子类对象时,会首先调用基类的构造函数来初始化基类的非静态成员变量。 4. **子类非静态成员初始化**:接着是子类的非静态成员变量初始化。 5. **基类构造函数调用**:通过`...

    探究java的ClassLoader及类变量初始化顺序

    需要注意的是,静态初始化块只在类被加载时执行一次,而实例初始化块(构造函数)则会在每次创建类的实例时执行。静态变量的初始化是在类加载时完成的,而实例变量的初始化则在对象创建时进行。 在实际开发中,对...

    Java静态和非静态成员变量初始化过程解析

    通过这两个示例,我们可以看到,非静态成员变量的初始化顺序是:成员变量初始化语句>成员变量初始化块>构造函数。 而对于静态成员变量,它们是在类加载时初始化的。例如,我们可以定义一个静态成员变量static ...

    浅析C#静态类,静态构造函数,静态变量

    在 `Cow` 类的示例中,静态构造函数 `static Cow()` 被用来初始化静态变量 `count`。值得注意的是,静态构造函数的执行时间早于任何实例构造函数,而且静态构造函数的执行顺序取决于静态成员的引用顺序,而不是代码...

    IT学生解惑真经.pdf

    在Java中,类的初始化顺序包括静态成员(变量和初始化块)、实例成员(变量和初始化块)以及构造函数的初始化顺序。具体的初始化顺序为: 1. **静态成员**:静态变量 -> 静态初始化块。 2. **实例成员**:非静态...

Global site tag (gtag.js) - Google Analytics