`

类初始化顺序实例

    博客分类:
  • JVM
 
阅读更多

Java类、实例的初始化顺序

看阿里巴巴的一道笔试题如下:

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");//相当于隐式
	  public int ding = print("ding");
	  
	  {
	      print("构造快");
	  }
	  
	  static {
	      print("静态块");
	  }
	  
	  
	  public int jie = print("jie");
	  
	  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){
	      T t = new T("init");
	  }
	}

 1:j   i=0   n=0

2:ding   i=1   n=1

3:构造快   i=2   n=2

4:jie   i=3   n=3

5:t1  i=4  n=4

6:j   i=5   n=5

7:ding   i=6   n=6

8:构造快   i=7   n=7

9:jie   i=8   n=8

10:t2  i=9  n=9

11:i   i=10   n=10

12:静态块   i=11   n=99

13:j   i=12   n=100

14:ding   i=13   n=101

15:构造快   i=14   n=102

16:jie   i=15   n=103

17:init  i=16  n=104

根据类初始化的顺序:

1、类的装载 -> 链接(验证 -> 准备 -> 解析) -> 初始化 -> 对象实例化;

红色、绿色、黄色的执行结果是在本程序源代码中下面的静态成员变量被初始化完成之前,已经有两个实例的初始化了,因此棕色代码依旧是类的初始化的过程。

2、public int j = print("j");此处相当于隐式代码,在对象初始化时候从上往下执行,如果构造函数在该代码下面先执行该代码,因为构造函数将隐式代码和构造函数看出一个整体来执行。5、10、17的执行结果是构造函数的执行结果。

3、类成员变量和代码块之间的执行顺序是先执行成员变量再执行代码块。

分享到:
评论

相关推荐

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

    本文详细介绍了类继承中的初始化顺序问题,包括初始化的基本概念、初始化过程中的关键步骤以及如何正确处理基类和子类之间的构造函数调用。理解这些概念对于编写高效、可维护的面向对象程序至关重要。希望通过对这些...

    类初始化和实例初始化1

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

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

    在实际开发中,理解这个初始化顺序是非常重要的,尤其是在设计复杂的类结构或者涉及单例模式、线程安全初始化等场景时。如果在构造器或初始化块中依赖其他静态或非静态成员,必须确保这些成员在需要之前已经被正确...

    C#中结构(struct)的部分初始化和完全初始化实例分析

    在C#编程语言中,结构(struct)是一种值类型,与类(class)不同,它在内存中的存储方式和行为有所区别。...理解并正确使用结构的初始化是C#程序员必备的知识点,特别是在处理值类型和避免潜在的未初始化问题时。

    java中类的初始化顺序

    ### Java中类的初始化顺序详解 #### 一、概述 在Java编程语言中,类的初始化是一个非常重要的概念。类的初始化涉及到多个方面,包括静态成员变量、实例成员变量、静态初始化块、实例初始化块以及构造函数等。本文...

    Java类继承初始化顺序

    当我们谈论“Java类继承初始化顺序”时,涉及到的关键知识点包括构造器、成员变量的初始化、super关键字以及方法的覆盖。 首先,了解类初始化的顺序至关重要。当创建一个子类实例时,初始化过程遵循以下步骤: 1. ...

    java程序初始化顺序

    以下是对Java程序初始化顺序的详细说明: 1. **类加载阶段**: - **加载**:当Java虚拟机(JVM)首次遇到一个类的引用时,会通过类加载器进行加载。加载过程包括找到类的.class文件,读取其字节码,并转化为内存中...

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

    在Objective-C中,对象的初始化和实例变量的作用域是编程中的关键概念,对于理解和创建健壮的iOS和macOS应用程序至关重要。 首先,让我们深入理解对象的初始化过程。在Objective-C中,初始化通常涉及`init`方法。每...

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

    同时,掌握类变量初始化顺序可以避免因误解而导致的错误,特别是在多线程环境中,对静态变量的并发访问和初始化顺序的控制需要特别注意。 总之,深入理解Java的ClassLoader机制和类变量初始化顺序是提升Java编程...

    Java类继承关系中的初始化顺序实例详解

    Java类继承关系中的初始化顺序实例详解 Java类继承关系中的初始化顺序是Java编程语言中的一個重要概念。该概念关系到类的初始化顺序,静态成员变量的初始化顺序,普通成员变量的初始化顺序等。在本文中,我们将详细...

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

    Java类的初始化和实例化详解 Java类的初始化和实例化是Java编程语言中两个非常重要的概念,它们都是Java类生命周期的重要组成部分。下面我们将详细介绍Java类的初始化和实例化的过程,并解释其中的细节。 一、Java...

    java代码的初始化顺序demo

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

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

    在Java中,类的初始化顺序是面试中的经典问题之一,它涉及到继承、静态成员以及实例成员等多个方面。正确理解类的初始化顺序对于编写正确、高效的代码至关重要。 首先,需要了解Java类初始化的基本规则,即在类的...

    Java初始化顺序1

    在上面的示例代码中,我们可以看到,类变量和实例变量的初始化顺序是按照定义的顺序进行的。同时,我们还可以看到,静态变量的初始化顺序是按照定义的顺序,并且只在第一次访问时初始化。 在 Java 中,static ...

    Spring实例化Bean顺序

    在Spring框架中,Bean的实例化顺序是一个关键概念,它...在实际开发中,应谨慎处理Bean的实例化顺序,以避免不必要的初始化问题和依赖循环。通过合理利用Spring提供的工具和机制,可以更好地控制和管理Bean的生命周期。

    Java类初始化和实例化中的2个“雷区”

    1. 不要在父类的静态初始化块中实例化子类,因为这可能导致子类的初始化顺序不正确,从而引发预期之外的行为。 2. 避免在类的静态字段初始化中直接或间接地依赖其他类尚未初始化的静态字段,因为这可能导致数据不...

    JAVA类的初始化顺序文.pdf

    总之,类的初始化顺序是:静态成员 -> 静态初始化块 -> 非静态成员 -> 非静态初始化块 -> 构造器。这个顺序同样适用于继承关系,只是会先初始化父类的部分,再初始化子类的部分。掌握这一知识能帮助程序员更好地设计...

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

    静态变量`a`和`b`的初始化顺序是按照它们在源代码中的出现顺序进行的,这里`a`先被初始化,然后是`b`。 另外,Java程序对类的使用有主动使用和被动使用两种情况。主动使用包括以下六种场景: 1. **创建类的实例**...

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

    这两种初始化块在创建类实例或加载类时分别扮演着不同的角色。 **静态初始化块** 静态初始化块是以`static`关键字标识的代码块,它在类被加载到Java虚拟机(JVM)时执行,且只执行一次。静态初始化块常用于设置类...

Global site tag (gtag.js) - Google Analytics