java程序初始化顺序

使用场景:  在java程序中,当实例化对象时,对象的所在类的所有成员变量首先要进行初始化,只有当所有类成员完成初始化后,

才会调用对象所在类的构造函数创建对象

初始化的原则

(1)静态对象优先于非静态对象初始化,静态对象只能初始化一次,但非静态对象可以初始化多次。

(2)超类优先于派生类初始化。

(3)按照成员变量定义的顺序来进行初始化,即使变量定义散布于方法定义之中,它们仍然在任何方法(包括构造器)被调用前初始化。

package test;
/*java程序初始化的顺序:超类静态变量 超类静态代码块 子类静态变量 子类静态代码块
 *  超类非静态变量 超类非静态代码块 超类构造函数  子类非静态代码块  子类非静态代码块
 *  子类构造函数*/

class Base {
    static {
        System.out.println("父类静态块");//(1)
    }
    {
        System.out.println("父类块");//(3)
    }

    public Base() {
        System.out.println("父类构造方法");//(4)
    }

    public static void A() {
        int a;//静态方法中不能有静态常量,因为static方法共享一块内存区域,主要用于累加,如果静态常量的常量话就不能累加了,就冲突了
        System.out.println("父类普通静态方法");
    }

}

public class Derived extends Base {
    static int a=1;
    static int b=2;
    static {
        System.out.println("子类静态块");//(2)
    }
    {
        System.out.println("子类块");//(5)
    }

    public Derived() {
        System.out.println("子类构造器");//(6)
    }

    public static void main(String[] args) {
        Base.A();
        new Derived();

    }
}
/*
 *public static void main(String[] args) {
        new Derived();
        Base.A();
    }
父类静态块
子类静态块
父类块
父类构造方法
子类块
子类构造器
父类普通静态方法
*/

/*
 *public static void main(String[] args) {
        Base.A();
        new Derived();

    }
 父类静态块
子类静态块
父类普通静态方法
父类块
父类构造方法
子类块
子类构造器
 * */

原文地址:https://www.cnblogs.com/shijinglu2018/p/9320772.html

时间: 2024-11-06 07:39:14

java程序初始化顺序的相关文章

Java程序初始化的顺序是怎样的

在Java语言中,当实例化对象时,对象所在类的所有成员变量首先要进行初始化,只有当所有类成员完成初始化后,才会调用对象所在类的构造函数创建对象. Java程序的初始化一般遵循以下三个原则(以下三原则优先级依次递减):(1)静态对象(变量)优先于非静态对象(变量)初始化,其中,静态对象(变量)只初始化一次,而非静态对象(变量)可能会初始化多次.(2)父类优先于子类进行初始化.(3)按照成员变量定义顺序进行初始化.即使变量定义散布于方法定义之中,它们依然在任何方法(包括构造函数)被调用之前先初始化.

Java 对象初始化顺序 执行顺序

先看一道Java面试题: 求这段程序的输出. 解答此题关键在于理解和掌握类的加载过程以及子类继承父类后,重写方法的调用问题: 从程序的执行顺序去解答: 1.编译:当这个类被编译通知后,会在相应的目录下生成两个.class 文件.一个是 Base.class,另外一个就是Base$Sub.class.这个时候类加载器将这两个.class  文件加载到内存 2.Base base= new Sub(): 声明父类变量base对子类的引用,JAVA类加载器将Base,Sub类加载到JVM(Java虚拟

JAVA的初始化顺序

这里主要是介绍JAVA的类的初始化顺序,比较基础:主要是以例子演示为主: 例子一: 1 package com.cnblog.GDUTtiantian; 2 3 /** 4 * 5 * @author GDUTtiantian 6 * @date 2014-5-19 下午1:30:10 7 * JAVA类的初始化顺序 8 */ 9 public class Tiantian { 10 11 { 12 System.out.println("初始化:代码块1"); 13 } 14 15

深入理解Java程序执行顺序

下面将从一道阿里巴巴试题详细分析Java程序执行顺序. 阿里巴巴试题 public class Test { public static int k = 0; public static Test t1 = new Test("t1"); public static Test t2 = new Test("t2"); public static int i = print("i"); public static int n = 99; publi

静态代码块、构造代码块、构造函数以及Java类初始化顺序

静态代码块:用staitc声明,jvm加载类时执行,仅执行一次构造代码块:类中直接用{}定义,每一次创建对象时执行.执行顺序优先级:静态块,main(),构造块,构造方法. 构造函数 public HelloA(){//构造函数 } 关于构造函数,以下几点要注意:1.对象一建立,就会调用与之相应的构造函数,也就是说,不建立对象,构造函数时不会运行的.2.构造函数的作用是用于给对象进行初始化.3.一个对象建立,构造函数只运行一次,而一般方法可以被该对象调用多次. 构造代码块 {//构造代码块 }

Java对象初始化顺序(一)

---恢复内容开始--- 偶尔翻到了关于Java对象初始化顺序的面试题,重新复习了一下,顺便做笔记. 1.父类子类构造函数执行的先后顺序 public class Test2 { public int Field; //step 1 public Test2(){ Field = 1; } } /*************************************************/ /** * 次类的目的仅是为了验证父类子类构造函数执行的先后顺序 */ public class T

java类初始化顺序

java类初始化顺序 执行顺序如下: 没有继承其他类时: 静态变量 静态初始化块 变量 初始化块 构造器 继承其他类时: 父类--静态变量 父类--静态初始化块 子类--静态变量 子类--静态初始化块 父类--变量 父类--初始化块 父类--构造器 子类--变量 子类--初始化块 子类--构造器 执行顺序图:

Java变量、Java对象初始化顺序

局部变量与成员变量: 局部变量分为: 行参:在方法签名中定义的局部变量,随方法的结束而凋亡. 方法内的局部变量:必须在方法内对其显示初始化,从初始化后开始生效,随方法的结束而凋亡. 代码块内的局部变量:必须在代码块内对其显示初始化,从初始化后开始生效,随代码块的结束而凋亡. 成员变量: 静态属性:类加载时初始化,随着类的存在而存在: 非静态属性:随着实例的属性存在而存在: 关于他两的区别: 1.局部变量不可以加static: 2.局部变量不可以加public.protected.private:

java程序初始化的顺序

来自:http://blog.csdn.net/socoolfj/article/details/750425   http://www.cnblogs.com/miniwiki/archive/2011/03/25/1995615.html 规则1(无继承情况下):对于静态变量.静态初始化块.变量.初始化块.构造器,它们的初始化顺序依次是(静态变量.静态初始化块)>(变量.初始化块)>构造器 规则2(有继承情况下):子类的静态变量和静态初始化块的初始化是在父类的变量.初始化块和构造器初始化之