装载:查找和导入类或接口的二进制数据,常用的是根据类的路径加载,还有根据网络的地址加载。
链接:执行校验、准备和解析步骤,其中解析步骤是可以选择的;
校验:检查导入类或接口的二进制数据的正确性;
准备:给类的静态变量分配并初始化存储空间;
解析:将符号引用转成直接引用;
初始化:激活类的静态变量的初始化Java代码和静态Java代码块。
其中 初始化(initialization)包含两部分:
1.类的初始化(initialization class & interface)---初始化静态变量和静态Java代码块
2.对象的创建(creation of new class instances)----new class()。
用一个简单的流程分析如下:
普通对象初始化 继承体系对象初始化
初始化
1.类的初始化,也就是静态变量以及静态块的初始化
1.1 如果有继承父类有静态变量或者静态块的,先执行初始化。
1.2 如果是final static ,那么就不会初始化类
1.3 如果执行的是父类的静态变量,那么子类不会初始化
public class SuperTmp {
public static int a = 10;
public final static int b = 20;
public int c = 10;
static{
System.out.println("init super calss...");
}
public SuperTmp (){
System.out.println("super init constructor:");
}
}
public class Sub extends SuperTmp {
public static final int aa = 30;
public static int bb = 40;
public int cc = 20;
static {
System.out.println("init sub class.....");
}
public Sub (){
System.out.println("sub init constructor:" );
}
}
public class Play {
public static void main(String[] args) {
/**输出
* init super calss...
* 10
* 不会初始化子类 Sub
*/
System.out.println(Sub.a);
/******
* 输出 b 不会初始化任何类
*/
System.out.println(Sub.b);
/***
* 输出
* init super calss...
* init sub class.....
* 40
*/
System.out.println(Sub.bb);
/*对象初始化
*init super calss...
init sub class.....
*super init constructor
sub init constructor
*/
Sub sb = new Sub()
}
}
2.创建class的对象
2.1.先为Sub类和其父类SuperTmp类分配内存空间,父类和子类的变量都初始化值,对象类型的为null,
基本数据类型的为默认的值,例如 int 类型的为初始化 0
2.2 执行构造函数Sub(), 调用父类的构造函数,输出“super init constructor”,“sub init constructor”。
2.3 初始化superTmp,Sub类的成员变量,并赋值
2.4 对于类实现了接口Interface,初始化它的时候并不会引起接口的初始化。
所以对象的创建,具体步骤如下:
(1) 所有的成员变量—包括该类,及它的父类中的成员变量--被分配内存空间,
并赋予默认值。(第一次初始化成员变量)
(2) 为所调用的构造函数初始化其参数变量。(如果有参数)
(3) 如果在构造函数中用this 调用了同类中的其他构造函数,
则按照步骤(2)~(6)去处理被调用到的构造函数。
(4) 如果在构造函数中用super调用了其父类的构造函数,
则按照步骤(2)~(6)去处理被调用到的父类构造函数。
(5) 按照书写顺序,执行instance initializer 和 instance variable initializer
来初始化成员变量。(第二次初始化成员变量)
(6) 按照书写顺序,执行构造函数的其余部分。
总结:
从类的初始化和对象的创建步骤,可以知道,一个类是先初始化static的变量和static句块,
然后在分配该类以及父类的成员变量的内存空间,赋予默认值,然后开始调用构造函数。
而子类和父类之间,则先初始化和创建父类,然后再初始化和创建子类的。
相关推荐
总之,理解并有效地使用静态和对象初始化块是Java开发中的关键技能,它们可以帮助我们更好地控制类和对象的初始化过程,确保代码的高效性和正确性。在实际编程中,我们应该根据需求谨慎选择合适的初始化策略,以优化...
下面是关于JAVA类和对象及数组的习题,涵盖了构造方法、继承、多重继承、变量声明、数组初始化等方面的知识点。 1. 构造方法的调用方式: 构造方法是类的特殊方法,用于初始化对象的状态。调用构造方法的方式有很多...
#### 一、Java对象、引用及创建过程 在Java中,对象是程序的基本单位,它包含了属性(成员变量)和行为(方法)。对象是由类创建出来的实例,而类则是一组具有相同属性和行为的对象的模板。 ##### 1. 对象创建与...
### Java中类的初始化顺序详解 #### 一、概述 在Java编程语言中,类的初始化是一个非常重要的概念。类的初始化涉及到多个方面,包括静态成员变量、实例成员变量、静态初始化块、实例初始化块以及构造函数等。本文...
总之,Java类继承初始化顺序涉及到静态和非静态初始化块、构造器的调用以及方法的覆盖。理解这些概念对于编写健壮的、易于维护的Java代码至关重要。在实际编程中,应合理利用继承特性,同时注意避免不必要的复杂性和...
这意味着静态成员和静态初始化块对于所有类的实例都是共享的,而实例成员和实例初始化块则是每个对象独有的。 在面试中,面试官可能会通过这种类型的题目来评估应聘者对Java内存模型的理解,以及他们在编写代码时...
Java中的对象初始化流程是编程实践中一个非常重要的概念,它涉及到类加载、静态初始化块、实例初始化块、构造器等多个方面。下面将详细解释这个过程。 首先,对象初始化流程的起点是程序的入口点,即`main`方法。当...
在Java编程语言中,类和对象的初始化是一个关键的概念,对于理解和编写健壮的程序至关重要。这个"java代码的初始化顺序demo"显然旨在演示这一过程。让我们深入探讨Java中的初始化顺序及其背后的机制。 1. **类加载...
详细讲解java类中静态变量,普通标量,对象、基本类型的初始化顺序。
这个压缩包文件包含三个源代码文件:StaticTest.java、Test.java和Father.java,它们可能用于演示类和对象初始化的不同方面。让我们逐一探讨这些概念。 1. **类的初始化** 类的初始化通常在以下几种情况下发生: ...
在Java编程语言中,程序初始化的顺序是一个关键概念,它涉及到类加载、对象创建以及执行流程的安排。了解这些顺序对于编写高效、无错误的代码至关重要。以下是对Java程序初始化顺序的详细说明: 1. **类加载阶段**...
静态初始化块用于在类加载时执行一次的初始化操作,而实例初始化块则在每次创建新对象时执行。这两个块可以用来设置默认值、初始化复杂对象或者执行其他必要的配置。 接下来,我们讨论Java方法。方法是代码的复用...
在学习 Java 编程语言时,对象初始化顺序是一个非常重要的知识点,但是许多学生却感到困惑和困难。事实上,Java 对象初始化顺序并不难理解,只需要掌握“礼让”原则和 JVM 的执行过程。 一、Java 对象初始化顺序的...
总结起来,Java初始化块是Java中用于对象和类初始化的重要工具,它们在不同场景下提供了一种灵活的方式来控制对象和类的状态。理解初始化块的工作原理对于编写高效且无错误的Java代码至关重要。在编写代码时,应谨慎...
Java 对象初始化是一个基础概念,但是很多人不知道它的内涵,特别是在类继承时。下面,我们从三个维度来分析 Java 对象的初始化过程。 一、从程序运行维度分析 在 Java 中,对象初始化是一个复杂的过程。我们可以...
在Java虚拟机(JVM)中,类的初始化会在类加载和连接完成后发生。 初始化阶段的目标是确保类的静态成员被正确地初始化。有两种主要的方式进行类的初始化: 1. **静态变量的声明处赋值**:这是最直接的方式,如`...
java编程思想-初始化与清理了解this之后,你就能更全面地理解“静态(static)方法”的含义。静态方法就是没有this的方法。在“静态方法”的内部不能调用“非静态方法”,反过来倒是可以的。而且你可以在没有创建...
本文详细介绍了类继承中的初始化顺序问题,包括初始化的基本概念、初始化过程中的关键步骤以及如何正确处理基类和子类之间的构造函数调用。理解这些概念对于编写高效、可维护的面向对象程序至关重要。希望通过对这些...
构造方法是类的特殊方法,用于初始化对象的状态。 在设计类时,如果这个类不需要有子类,类的实现细节不允许改变,并且确信这个类不会再被扩展,那么就设计为final类。final类的成员方法没有机会被覆盖,默认情况下...