首先来看一段程序,通过它的输出来分析类的加载以及实例化的机制。
public class T implements Cloneable {
public static int k = 0;
public static T t1 = new T("t1");
public static T t2 = new T("t2");
public static int i = print("i");
public static int n = 99;
public int j = print("j");
{
print("构造块");
}
static {
print("静态块");
}
public T(String str) {
System.out.println((++k) + ":" + str + " i=" + i + " n=" + n);
++n;
++i;
}
public static int print(String str) {
System.out.println((++k) + ":" + str + " i=" + i + " n=" + n);
++n;
return ++i;
}
public static void main(String[] args) {
}
}
输出:
1:j i=0 n=0
2:构造块 i=1 n=1
3:t1 i=2 n=2
4:j i=3 n=3
5:构造块 i=4 n=4
6:t2 i=5 n=5
7:i i=6 n=6
8:静态块 i=7 n=99
首先从main函数进入程序,类中的静态成员会被先加载,加载的时候,JVM首先将类中静态属性的声明和静态方法的声明加载到内存中(方法区中),然后将静态属性赋值,之后执行静态块中的代码。如果在类加载的时候遇到实例化的情况,首先加载普通属性的声明,然后普通方法的声明,之后是普通属性赋值,执行构造块代码,最后执行构造函数中的代码。如果有继承关系,父类优先于子类。这是基本的加载顺序。
接下来我们逐行来分析。首先加载类中的静态属性声明,(static )int k, T t1, T t2, int i, int n,
(只有声明还没有赋值),然后加载静态方法声明static int print(String str) {}。之后对静态属性赋值,首先加载k = 1;
当加载到t1 = new T("t1")时,这是实例化的过程,这时类暂时不加载。按照上面所说的,实例化的时候首先加载类中的普通成员声明 int j, 然后是普通方法声明,public T(String str){},之后对普通属性赋值,这时j = print("j"), 就调用了public static int print(String str){} 方法,这时的i和n还没有被赋值,仅仅是JVM在声明时给它分配的初始值,都为0。因此这时的输出为1:j i=0 n=0。这是普通属性的赋值,接下来是构造块的执行因此有了第二行输出:2:构造块 i=1 n=1,最后是构造函数执行,有了第三行输出:3:t1 i=2 n=2。到现在t1的实例化过程结束,接着进行类的加载。 接下来对t2进行复制,也是一个实例化的过程,和上面蓝色字体描述的一样, 于是就有了4,5,6三行输出。再下面对static int i进行复制 i = print("i") 因此有了第七行输出。接下来对public static n 进行赋值, n = 99。此时静态属性赋值全部结束,最后加载静态块中的内容,print("静态块"), 因为这时的n已经被赋值了,因此最后的输出为:8:静态块 i=7 n=99
分享到:
相关推荐
Java中的继承与静态static等的执行先后顺序的面试题 java面试题静态加载顺序构造方法 继承与static 面试题目如下:请写出程序执行完成之后的结果。 package extend; public class X { Y y=new Y(); ...
当我们谈论“Java类继承初始化顺序”时,涉及到的关键知识点包括构造器、成员变量的初始化、super关键字以及方法的覆盖。 首先,了解类初始化的顺序至关重要。当创建一个子类实例时,初始化过程遵循以下步骤: 1. ...
在Java编程语言中,继承是面向对象特性的重要组成部分,它允许一个类(子类)从另一个类(父类)继承属性和方法。了解Java中继承关系的加载顺序对于理解和优化程序性能至关重要。以下是对这个主题的详细阐述: 1. ...
### Java中类的初始化顺序详解 #### 一、概述 在Java编程语言中,类的初始化是一个非常重要的概念。类的初始化涉及到多个方面,包括静态成员变量、实例成员变量、静态初始化块、实例初始化块以及构造函数等。本文...
至于文件`任务安排表.xls`,虽然与Java类的运行顺序直接关系不大,但可以想象在实际项目中,它可能被用来规划和跟踪类的加载和初始化过程,或者记录类之间的依赖关系。例如,通过Excel表格,我们可以列出各个类的...
在Java编程语言中,程序初始化的顺序是一个关键概念,它涉及到类加载、对象创建以及执行流程的安排。了解这些顺序对于编写高效、无错误的代码至关重要。以下是对Java程序初始化顺序的详细说明: 1. **类加载阶段**...
类--初始化块"); 39. } 40. // 构造器 41. public SubClass() { 42. System.out.println("子类--构造器"); 43. } 44. 45. public static void main(String[]...因此,掌握类的初始化顺序是每个Java开发者必备的知识点。
在本文中,我们讨论了 Java 类加载器中的静态变量初始化机制,了解了静态变量的初始化顺序和类加载器的生命周期。通过对静态变量初始化机制的理解,我们可以更好地掌握 Java 语言的基础知识,并更好地应用 Java 语言...
本文将详细探讨Java类的加载、初始化、执行等步骤,并通过实例分析阿里面试中可能涉及的相关问题,结合流程图帮助理解这一过程。 首先,我们来了解Java类在JVM(Java虚拟机)中的生命周期。一个Java类的生命周期...
Java类的初始化和实例化是Java编程语言中两个非常重要的概念,它们都是Java类生命周期的重要组成部分。下面我们将详细介绍Java类的初始化和实例化的过程,并解释其中的细节。 一、Java类的初始化 Java类的初始化是...
以下是Tomcat启动过程中类加载的具体顺序: #### 三、类加载顺序详述 1. **Bootstrap Classes of your JVM** 这是JVM自带的一组核心类,由Bootstrap ClassLoader加载,通常位于$JAVA_HOME/jre/lib/rt.jar等位置。...
static代码块的加载时间是在类加载时执行的,而不是在实例化对象时执行的。 继承类中构造器的隐式调用 在上面的例子中,SubClass的构造器中会隐式的调用父类的构造器。这是因为在Java中,子类的构造器会隐式的调用...
Java中,类变量(static变量)的初始化顺序遵循以下规则: 1. 首先,执行父类的静态初始化块(方法),如果有的话。 2. 然后,执行子类的静态初始化块。 3. 静态变量的初始化顺序取决于它们在代码中声明的顺序,而...
总之,Java代码的初始化顺序是类加载的必然过程,涉及到静态和实例初始化块、构造函数、成员变量初始化以及继承关系的影响。这个demo是学习和理解这些概念的重要工具,通过实际操作可以加深对Java内存管理和对象生命...
为了避免此类问题,应避免在静态初始化块中直接实例化当前类,而是将其延迟到类完全加载和初始化之后。 ### 结论 理解Java类的构造执行顺序对于编写高效、可维护的代码至关重要。遵循正确的构造顺序不仅有助于避免...
这个顺序反映了类加载和实例化过程中静态和非静态部分的执行流程。理解这个顺序对于理解和调试复杂的Java程序,特别是涉及多层继承和静态/非静态成员交互的场景,是非常重要的。在面试中,能够清楚地解释这个过程...
"Java 中类加载过程全面解析" Java 中类加载过程是 Java 语言中一个非常重要的机制,它负责将类文件加载到内存中,以便 JVM 可以使用这些类。类加载过程是一个复杂的过程,涉及到多个步骤和机制。下面将对 Java 中...
类实例化顺序是Java编程中一个关键的概念,它涉及到类加载、初始化以及对象创建等多个步骤。在面试或笔试中,理解这些顺序对于解答相关问题至关重要。以下是对类实例化顺序的详细讲解,以及阿里巴巴笔试题的解析。 ...