Java的初始化过程

在刷题的过程中,时常会碰到关于Java中的类的初始化顺序的问题。

总结如下,便于以后复习:

初始化过程:

  1. 首先,初始化父类中的静态成员变量和静态代码块,按照在程序中出现的顺序初始化;
  2. 然后,初始化子类中的静态成员变量和静态代码块,按照在程序中出现的顺序初始化;
  3. 其次,初始化父类的普通成员变量和代码块,再执行父类的构造方法;
  4. 最后,初始化子类的普通成员变量和代码块,再执行子类的构造方法;

举例如下:

class C {
    C() {
        System.out.print("C");
    }
}

class A {
    C c = new C();

    A() {
        this("A");
        System.out.print("A");
    }

    A(String s) {
        System.out.print(s);
    }
}

class Test extends A {
    Test() {
        super("B");
        System.out.print("B");
    }

    public static void main(String[] args) {
        new Test();
    }
}

在上面的程序中,new了一个新类Test后,其初始化过程如下:

  1. 调用构造方法来初始化该子对象,但是因为Test继承自类A,所以需要先调用A的构造方法;
  2. 在Test的构造方法中通过super("B") 显式调用了父类的带参构造方法,将不再调用其无参构造方法;
  3. 再执行A的构造方法之前,需要先对其成员变量进行初始化,因此会执行C的构造方法。
  4. 由此可知,最终的调用顺序为:类C的无参构造——>类A的带参构造——>类Test的构造方法的其余部分。

因此最后输出的结果为:

CBB

时间: 2024-10-27 05:17:40

Java的初始化过程的相关文章

Java 类初始化过程

     1  class X {      2     Y b = new Y();      3     X() {      4           System.out.print("X");      5     }      6  }      7         8  class Y {      9     Y() {     10           System.out.print("Y");     11     }     12  }    

java对象初始化过程

Java 对象创建过程

在某些项目中,会使用到静态块,构造器中初始化其他对象...深刻理解了java类初始化过程,这些将不在是问题. 那java对象的步骤是什么呢? 假设现在有People类,未显示继承任何其他类,初始化过程是这样的. 1 java 解释器必须查找类路径,以定位People.class文件.在首次创建对象时(构造器是静态方法),或people类的静态方法/静态域首次被访问时. 2 载入People.class,静态初始化的所有动作都会执行,且静态初始化只在Class对象首次加载的时候进行一次. 3 当使

java代码的初始化过程研究

刚刚在ITeye上看到一篇关于java代码初始化的文章,看到代码我试着推理了下结果,虽然是大学时代学的知识了,没想到还能做对.(看来自己大学时掌握的基础还算不错,(*^__^*) 嘻嘻--)但是博主写的不够详细具体,我想在这详细谈一下java代码的具体初始化过程. 首先要清楚,初始化分为两个过程:类初始化.对象初始化. 类初始化是指类加载器将类加载到内存时,对类成员的初始化过程,也就是有static修饰的变量.对于加载完的类,它的类变量都会赋一个默认值,即使你定义时就赋值了.比如int类型就是0

Java父类子类的对象初始化过程

摘要 Java基本的对象初始化过程,子类的初始化,以及涉及到父类和子类的转化时可能引起混乱的情况. 1. 基本初始化过程: 对于一个简单类的初始化过程是: static 修饰的模块(static变量和static 块)  ---> 按照代码顺序依次执行. | 实例变量  及非static模块---> 按照代码顺序依次执行. | 构造函数 ---> 执行对应的构造函数. 子类的初始化过程. 父类static修饰的模块 | 子类static修饰模块 | 父类实例变量和非static块 | 父

Java中的初始化过程(转)

原文:http://www.cnblogs.com/mmbo/archive/2009/10/05/1578156.html 1.类成员自动初始化,基本类型总是最先初始化为0(boolean为false,(char)0),对象的引用初始化为null:2.类成员指定初始化,可以在类成员定义或构造器(包括其他方法)中给基本类型和非基本类型对象初始化,但这并不能阻止自动初始化首先进行:3.按类成员定义的顺序决定初始化的顺序:4.静态成员只有在第一次被访问时(class对象首次加载)才会被初始化,此后不

Java类的实例化的初始化过程

A a = new A(); new 创建对象过程: 1.类加载 代码验证 2.给对象在内存(堆)中分配空间(给属性赋值): 3.属性赋默认值: byte,short.int,long ->0 float  ->0.0f double ->0.0 boolean  ->false String ->null char ->'\u0000' 4.给属性赋初始值:(用等号'=') 5.调用构造方法(方法和类名相同,没有返回类型) 6.将对象在堆区中的首地址返回给引用a /*

解析Java类和对象的初始化过程

类的初始化和对象初始化是 JVM 管理的类型生命周期中非常重要的两个环节,Google 了一遍网络,有关类装载机制的文章倒是不少,然而类初始化和对象初始化的文章并不多,特别是从字节码和 JVM 层次来分析的文章更是鲜有所见. 本文主要对类和对象初始化全过程进行分析,通过一个实际问题引入,将源代码转换成 JVM 字节码后,对 JVM 执行过程的关键点进行全面解析,并在文中穿插入了相关 JVM 规范和 JVM 的部分内部理论知识,以理论与实际结合的方式介绍对象初始化和类初始化之间的协作以及可能存在的

Android(java)学习笔记159:Dalivk虚拟机的初始化过程

1.初始化下面系统函数(调用dvmStartup函数初始化所有相关的函数) 开始学习虚拟机的初始化过程,先从dvmStartup函数开始,这个函数实现所有开始虚拟机的准备工作: dvmAllocTrackerStartup函数初始化跟踪显示系统,跟踪系统主要用生成调试系统的数据包. dvmGcStartup函数是用来初始化垃圾回收器. dvmThreadStartup函数是初始化线程列表和主线程环境参数. dvmInlineNativeStartup函数是分配内部操作方法的表格内存. dvmVe