`

类的初始化,对象的实例化

    博客分类:
  • java
 
阅读更多


上图展示的是类生命周期流向;在本文里,我只打算谈谈类的"初始化"以及"对象实例化"两个阶段。

类"初始化"阶段,它是一个类或接口被首次使用的前阶段中的最后一项工作,本阶段负责为类变量赋予正确的初始值。

Java 编译器把所有的类变量初始化语句和类型的静态初始化器通通收集到 <clinit> 方法内,该方法只能被 Jvm 调用,专门承担初始化工作。

除接口以外,初始化一个类之前必须保证其直接超类已被初始化,并且该初始化过程是由 Jvm 保证线程安全的。另外,并非所有的类都会拥有一个 <clinit>() 方法,在以下条件中该类不会拥有 <clinit>() 方法:

    该类既没有声明任何类变量,也没有静态初始化语句;
    该类声明了类变量,但没有明确使用类变量初始化语句或静态初始化语句初始化;
    该类仅包含静态 final 变量的类变量初始化语句,并且类变量初始化语句是编译时常量表达式。



类被装载、连接和初始化,这个类就随时都可能使用了。对象实例化和初始化是就是对象生命的起始阶段的活动,在这里我们主要讨论对象的初始化工作的相关特点。

Java 编译器在编译每个类时都会为该类至少生成一个实例初始化方法--即 "<init>()" 方法。此方法与源代码中的每个构造方法相对应,如果类没有明确地声明任何构造方法,编译器则为该类生成一个默认的无参构造方法,这个默认的构造器仅仅调用父类的无参构造器,与此同时也会生成一个与默认构造方法对应的 "<init>()" 方法.

通常来说,<init>() 方法内包括的代码内容大概为:调用另一个 <init>() 方法;对实例变量初始化;与其对应的构造方法内的代码。

如果构造方法是明确地从调用同一个类中的另一个构造方法开始,那它对应的 <init>() 方法体内包括的内容为:一个对本类的 <init>() 方法的调用;对应用构造方法内的所有字节码。

如果构造方法不是通过调用自身类的其它构造方法开始,并且该对象不是 Object 对象,那 <init>() 法内则包括的内容为:一个对父类 <init>() 方法的调用;对实例变量初始化方法的字节码;最后是对应构造子的方法体字节码。

如果这个类是 Object,那么它的 <init>() 方法则不包括对父类 <init>() 方法的调用。
分享到:
评论

相关推荐

    类初始化和实例初始化1

    在Java编程语言中,类和实例的初始化是程序运行中的重要环节,对于理解和优化代码的执行效率至关重要。这里我们将深入探讨这两个概念。 首先,我们来看类的初始化过程,也称为类加载与初始化。当Java虚拟机(JVM)...

    Objective-C 2.0 with Cocoa Foundation--- 7,对象的初始化以及实例变量的作用域

    其他初始化器,称为便利初始化器(convenience initializers),最终会调用指定初始化器,确保完整地初始化对象。 实例变量(instance variables)在Objective-C中存储对象的状态。它们的访问控制可以是`@public`、...

    java实例化对象的过程

    这会执行构造器中的代码,初始化对象的状态。 3. **构造器的执行**:当`new`关键字被调用时,会执行对应的构造器。在这个例子中,构造器将字符串"John"赋值给`name`属性。 4. **返回对象引用**:构造器执行完毕后...

    php初始化对象类.zip

    主要是对php初始化对象和析构函数的简单实例进行了介绍,需要的朋友可以过来参考下,希望对大家有所帮助。当对象内部的操作执行完毕的时候,__destruct()被调用, 然后对象所使用的内存被释放出来。

    简单了解java类的初始化以及类的实例化

    Java类的初始化和实例化详解 Java类的初始化和实例化是Java编程语言中两个非常重要的概念,它们都是Java类生命周期的重要组成部分。...只有当对象实例化进入堆内存中以后,非静态变量才会被初始化赋值。

    Java实例化一个抽象类对象的方法教程

    但是,抽象类可以拥有构造方法,这是因为构造方法主要用于初始化对象,而不是创建对象。当子类实例化时,会调用抽象类中的构造方法进行初始化。 在Java中,实例化抽象类的一种常见方式是通过子类继承并实现抽象方法...

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

    在Java编程语言中,初始化块是程序执行时用于初始化对象或类的重要机制。这里我们将深入探讨两种类型的初始化块:静态初始化块(Static Initializer Block)和对象初始化块(Instance Initializer Block)。这两种...

    对象初始化流程梳理对象初始化流程梳理

    Java中的对象初始化流程是编程实践中一个非常重要的概念,它涉及到类加载、静态初始化块、实例初始化块、构造器等多个方面。下面将详细解释这个过程。 首先,对象初始化流程的起点是程序的入口点,即`main`方法。当...

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

    然而,在涉及到类继承时,一个重要的问题是类实例化时的初始化顺序。本篇文章将围绕“类继承的初始化顺序”这一主题展开,详细解析初始化过程中涉及的关键概念和技术细节。 ### 类继承的初始化顺序概述 在面向对象...

    VB 数组的初始化实例

    在VB中,有多种方法可以初始化数组,本篇文章将深入探讨这些方法,并通过实例来说明。 ### 1. 静态初始化 静态初始化是在声明数组的同时为每个元素赋予特定的初始值。在VB中,可以使用以下语法: ```vb Dim 数组...

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

    这意味着静态成员和静态初始化块对于所有类的实例都是共享的,而实例成员和实例初始化块则是每个对象独有的。 在面试中,面试官可能会通过这种类型的题目来评估应聘者对Java内存模型的理解,以及他们在编写代码时...

    java中类的初始化顺序

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

    EnumTest-初始化类的类成员对象(初始化列表方式).zip

    在实际编程中,如果类的成员对象是其他类的实例,我们同样可以通过初始化列表传递参数给这些成员对象的构造函数。例如: ```cpp class OtherClass { public: OtherClass(int value) : m_value(value) {} // ... ...

    java中对象创建、初始化、引用

    - **初始化对象**:通过构造器初始化新创建的对象,设置其初始状态。 - **赋值**:最后,将创建好的对象的引用赋给之前声明的引用变量。 例如,下面的代码展示了如何创建一个`A`类的对象: ```java A a1 = new A()...

    类和对象的初始化过程.zip

    总结,这个压缩包文件提供了关于Java中类和对象初始化的实例,包括静态和非静态成员的处理、继承、构造函数的调用顺序等。通过分析并运行这些代码,开发者可以更深入地理解Java的初始化机制。对于初学者来说,这是一...

    Python 面向对象编程:类的创建与初始化、实例属性与方法、类属性与方法

    在Python中,面向对象主要涉及类(Class)的创建、实例化(Instantiation)、属性(Attributes)和方法(Methods)。 1. 类的创建与实例化: 在Python中,类通过`class`关键字定义。类名通常遵循“驼峰式命名”,...

    Java类继承初始化顺序

    静态初始化块用于初始化类级别的静态变量,它们只在类加载时执行一次。 2. **成员变量初始化**:接下来,初始化父类的非静态成员变量,这是通过调用父类的构造器实现的。Java规定每个子类实例在构造之前必须先调用...

    java程序初始化顺序

    - 实例初始化块({}):然后执行类中的实例初始化块,这些代码会为实例变量赋值或执行其他初始化任务。 - 构造器主体:最后,执行当前类的构造器主体,完成对象的具体初始化。 4. **多线程下的初始化**: - 当多...

    spring配置实例化后执行的初始化方法比对

    spring配置对象实例化后执行的方法,两种实现比对,通过InitializingBean接口,并实现arterPropertiesSet()方法;或者通过applicationContext.xml配置init-method属性

Global site tag (gtag.js) - Google Analytics