`

JAVA类的初始化过程

阅读更多
1、java类中的字段,第一步是自动初始化,比如定义了
private int i;

由于没有给其赋值,i会被自动赋值为0。这个步骤是仅限于类中的字段的,如果方法中的临时变量,不会有这个动作。而且如果在方法中使用未经赋值的变量,编译会不通过

2、第二步是指定初始化
private int i = 3;

如果有了显式的赋初值,那么第一步的自动初始化就不会发生了。但是该步骤和自动初始化,必定发生其一。即使在构造方法里给i赋值为4,还是首先会调用指定初始化,先赋值成3再赋值成4

3、第三步是初始化语句块初始化
{
    i = 4;
}

这个动作发生在自动初始化或者指定初始化之后,发生在构造方法初始化之前。如果没有初始化语句块,那么这个步骤就不会发生

4、第四步才是构造方法中的初始化
public className(){
    i = 4;
}

这个动作是发生在初始化语句块之后,如果没有的话,就是发生在自动初始化或者指定初始化之后。这个动作也是初始化的最后一个步骤

5、在类中的任何方法执行之前(包括构造方法),首先会完成所有字段的初始化

6、类只在初次使用时才会被加载。“初次使用”通常是指创建类的第一个对象时,或者当初次访问类中的static字段或者static方法时。但是由于构造方法实际上也是static方法(只是static关键字没有要求显式地写出来),所以也可以说,类的加载是发生在类的任何static成员(包括static字段、static方法、构造方法)被初次访问时

7、当初始化类的字段时,会先初始化static字段,再初始化非static字段

8、在调用构造方法时,会从最顶端的基类开始,依次调用每个类的构造方法。如果基类的构造方法是默认构造方法(不含构造方法参数),那么就不需要显式地调用super(),但是如果基类只包含含参数的构造方法,就必须显式地调用super()
分享到:
评论
3 楼 木mu 2012-01-17  
  恩,书上的东西,有些真的是有问题,虽然 <Thinking in java> 是业内的权威书籍,可是难免会有错误,你说呢?
  我觉得吧,相信编译器绝对没错,比谁都靠谱!
2 楼 kyfxbl 2012-01-05  
还有 “但是由于构造方法实际上也是static方法”,这个观点貌似也不正确吧?


LZ你好,谢谢你的热情回帖。貌似你的回帖比我的主贴还长了,呵呵

这个观点是《thinking in java》里提出来的,我没有验证过,只是觉得他也说得通,就记下来了。也许不一定是正确的,谢谢哦
1 楼 木mu 2012-01-05  
  “初次使用”通常是指创建类的第一个对象时,或者当初次访问类中的static字段或者static方法时。但是由于构造方法实际上也是static方法(只是static关键字没有要求显式地写出来),所以也可以说,类的加载是发生在类的任何static成员(包括 static字段、static方法、构造方法)被初次访问时
  
   “初次使用通常是指创建类的第一个对象时,或者当初次访问类中的static字段或者static方法时”,
   前半句木有问题,可是后半句就不对了吧?当JVM 中存在一个某个对象的实例,一定是通过new 关键字显示调用了该对象的构造方法才会存在该对象的实例,即便是用反射最后也是调用目标对象的构造器来进行实例化的。而在木有实例化该对象的情况下访问对象中的static 字段或者static 方法时,JVM中不存在该对象的实例的。
   还有 “但是由于构造方法实际上也是static方法” ,这个观点貌似也不正确吧?其实就是楼主这个观点导致上面的结论。
   static 跟类的构造器是两回事,构造器根本不等于static 的方法!想想看,我们通过new 关键字可以无限量的创建某个类的实例,可是我们调用该类中某个static 类型的方法或者字段,可是别忘了JavaSE 规范中提到的static 类型的变量或者方法JVM 仅会存在一份并且是全局唯一,跟“构造方法实际上也是static方法”是不是矛盾了?
   而且,从类的加载顺序来看,两者也不等同,static 修饰的变量或者方法都是由JVM 自动加载并且初始化,而此时JVM 中并不存在该对象的任何实例,而成员变量必须是我们显示的通过new 关键字调用构造器之后才会触发JVM 去逐一加载并初始化。
   以上是个人观点,也是通过一点简单的代码做的实验以及参考的一些资料所得出的结论,有不对的地方,还请指正。
  

相关推荐

    java面试题-类的初始化顺序.doc

    类--初始化块"); 39. } 40. // 构造器 41. public SubClass() { 42. System.out.println("子类--构造器"); 43. } 44. 45. public static void main(String[]...因此,掌握类的初始化顺序是每个Java开发者必备的知识点。

    java程序初始化顺序

    - 当多个线程同时尝试初始化同一个类时,Java保证只会执行一次类的初始化过程。这是由JVM的同步机制保证的,避免了数据竞争的问题。 5. **接口初始化**: - 接口没有实例变量,所以不存在实例初始化阶段。接口的...

    Java类继承初始化顺序

    当创建一个子类实例时,初始化过程遵循以下步骤: 1. **静态初始化**:首先,执行父类的静态初始化块,然后执行子类的静态初始化块。静态初始化块用于初始化类级别的静态变量,它们只在类加载时执行一次。 2. **...

    java类变量初始化顺序

    详细讲解java类中静态变量,普通标量,对象、基本类型的初始化顺序。

    Java类初始化顺序

    当一个Java类被实例化或者其静态成员被访问时,类的初始化过程就开始了。以下详细解释了Java类的初始化顺序: 1. **初始化父类**: 在子类的构造方法执行之前,首先会调用父类的构造方法。如果子类没有明确指定...

    java代码的初始化顺序demo

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

    java中类的初始化顺序

    本文将详细探讨Java中类的初始化过程及其顺序,并通过具体的代码示例来帮助理解这一过程。 #### 二、基础知识 1. **静态成员变量(Static Fields)**:在类加载时初始化。 2. **实例成员变量(Instance Fields)**...

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

    本篇文章将围绕“类继承的初始化顺序”这一主题展开,详细解析初始化过程中涉及的关键概念和技术细节。 ### 类继承的初始化顺序概述 在面向对象语言中(如Java、C#等),当创建一个继承自某个基类的子类对象时,会...

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

    总之,理解并有效地使用静态和对象初始化块是Java开发中的关键技能,它们可以帮助我们更好地控制类和对象的初始化过程,确保代码的高效性和正确性。在实际编程中,我们应该根据需求谨慎选择合适的初始化策略,以优化...

    Java变量初始化

    Java 变量初始化的时机是指在 Java 语言中变量的初始化过程,包括变量的声明、初始化和赋值的步骤。 Java 变量声明 在 Java 语言中,每个变量必须先声明,然后才能使用。声明变量时必须指定该变量的数据类型。...

    “礼让”原则学习Java对象初始化顺序.pdf

    Java 对象初始化顺序是指在 Java 程序中,对象的初始化过程中发生的顺序问题。这是 Java 编程语言的基础知识点之一,但是许多学生在学习和使用时总是感到困惑和困难。 二、JVM 执行过程中的“礼让”原则 JVM 在...

    详解Spring 中如何控制2个bean中的初始化顺序

    Spring 中控制 2 个 bean 的初始化顺序 在 Spring 框架中,控制多个 bean 的初始化顺序是一个常见的问题。本篇文章将详细介绍如何控制 2 个 bean 的初始化顺序,提供了多种实现方式,并分析了每种方式的优缺。 ...

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

    ### Java 类中静态域、块,非静态域、块,构造函数的初始化顺序 #### 一、概述 在 Java 编程语言中,类的初始化顺序对于理解程序的行为至关重要。特别是当涉及到静态域(静态变量)、非静态域(实例变量)、静态块...

    深入java虚拟机(三)——类的生命周期(下)类的初始化1

    【深入Java虚拟机(三)——类的生命周期(下)类的初始化1】 类的生命周期在Java中是一个关键的概念,它涵盖了从加载到卸载的整个过程。在类的生命周期中,初始化阶段是非常重要的,因为它涉及到类的静态变量的赋值...

    java 初始化与方法

    Java初始化与方法是Java编程语言中的核心概念,它们在程序执行过程中起着至关重要的作用。本文将深入探讨Java中的初始化过程、方法的定义与调用,以及与之相关的源码和工具应用。 首先,让我们从类的初始化开始。在...

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

    理解ClassLoader的工作机制以及类变量初始化的顺序对于深入理解Java运行时环境至关重要。这篇博文将探讨这两个主题。 首先,让我们深入了解Java的ClassLoader。ClassLoader是一个抽象类,它是Java中的一个关键组件...

    Java初始化顺序1

    Java 初始化顺序详解 在 Java 中,变量可以分为两类:类变量(静态变量)和实例变量(对象变量)。类变量是使用 static 关键字修饰的变量,它们属于类,而不是对象。实例变量则是没有使用 static 关键字修饰的变量...

    JAVA面试题解惑系列——类的初始化顺序

    特别要注意的是,在子类的初始化过程中,子类的静态变量和静态初始化块会在父类的变量、初始化块、构造器之前就被初始化。也就是说,在父类完全初始化完毕之前,子类的静态成员已经完成初始化了。 这个顺序很重要,...

Global site tag (gtag.js) - Google Analytics