`

java类的初始化顺序深究

 
阅读更多
package Test;

public class Test {
	private static Test tester = new Test(); // step 1
	private static int count1; // step 2
	private static int count2 = 333; // step 3

	public Test() { // step 4
		count1++;
		count2++;
		System.out.println(count1 + "\t" + count2);
	}

	public static Test getTester() { // step 5
		return tester;
	}

	public static void main(String[] args) {
	       //Test.getTester();
	
       }
}说明:

 

Test.getTester();这句话写和不写区别不大!

粗看这道题,感觉没什么,只是类加载顺序的问题。不过比较关键的一点是private static Test tester = new Test(); 

这段话把test这个对象给new出来了。牵一发而动全身,count1和count2也开始执行了。这就变得复杂些了。

一开始猜测运行答案:

1     334

程序的实际运行结果是:

1   1

好神奇的结果,想破脑袋都不太明白是怎么一回事。

最后查了下资料:

原来类加载的时候首先开辟了内存,然后赋予了默认的初始值。

也就是说count1和count2的内存首先被开辟出来了。

(具体是new Test()的时候开辟的,还是加载类的时候就开始开辟了,这需要再查下书!

  我的看法是:在new对象的时候才开辟了类里面的count1和count2的内存

)

明白了这个过程,我们就能够理解为什么结果是1 1了,那是因为先执行的这句

private static Test tester = new Test(); // step 1

,然后走的构造方法,因为count1和count2内存已经被开辟出来了,所以count1++ 结果是1,count2++结果也是1

如果我们在main方法里面,再输出一下下面这句话

System.out.println(count1 + "\t" + count2);

发现结果是1  333。

分析过程:

     程序执行完这句

private static Test tester = new Test(); 

就会走

private static int count1; // step 2
	private static int count2 = 333; // step 3
发现count1没有赋值动作,就执行count2,于是count1还是1,而count2就变成333

 

分享到:
评论

相关推荐

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

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

    java数组初始化详解

    Java 数组初始化详解 Java 数组初始化是 Java 编程语言中的一种基本概念,它允许开发者创建和初始化数组,以便于存储和操作数据。在本文中,我们将对 Java 数组初始化进行详细的介绍,包括一维数组和二维数组的声明...

    Java类继承初始化顺序

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

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

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

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

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

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

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

    Java变量初始化

    Java 变量初始化的时机可以分为两类:实例变量初始化和类变量初始化。 实例变量初始化 实例变量初始化可以在三个地方进行: 1. 定义实例变量的时候指定初始值; 2. 非静态初始化代码块中对实例变量指定初值; 3. ...

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

    了解类的初始化对于优化代码性能、避免并发问题以及理解Java程序的行为至关重要。在实际编程中,我们需要注意静态初始化的时机,因为这可能会影响程序的全局状态。同时,合理的初始化策略也可以帮助我们编写出更加...

    Java类初始化顺序

    Java类的初始化顺序是编程中一个非常重要的概念,它涉及到对象的创建过程和成员变量的初始化。当一个Java类被实例化或者其静态成员被访问时,类的初始化过程就开始了。以下详细解释了Java类的初始化顺序: 1. **...

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

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

    java 初始化与方法

    在Java中,类的初始化通常发生在以下几个时刻:当类被首次加载、创建类的实例、访问静态变量或调用静态方法时。初始化过程包括了静态块和实例块的执行,以及构造函数的调用。静态初始化块用于在类加载时执行一次的...

    类初始化顺序示例讲解

    本文将基于给定的Java示例代码深入探讨类初始化的顺序问题。这不仅是Java语言的关键特性之一,在其他面向对象语言(如C++、.NET)中也有相似的概念。理解这一概念有助于程序员更好地掌握面向对象程序的设计与实现。 ...

    C++和Java初始化顺序的比较代码

    2. 非静态数据成员:在构造函数初始化列表中,成员变量按照它们在类声明中的顺序被初始化。即使初始化列表中的顺序不同,也会按照声明的顺序进行。 例如: ```cpp class MyClass { public: int a; int b; static...

    6种方法初始化JAVA中的list集合

    本文将详细介绍6种初始化Java List集合的方法,并通过代码示例帮助理解每种方法的使用和特点。 1. 常规方式 这是最常见的初始化List的方式,通过创建ArrayList实例并逐个添加元素。自JDK 7以后,可以省略泛型类型的...

    JAVA面试题解惑系列(一)——类的初始化顺序-JAVA程序员JAVA工程师面试必看.pdf,这是一份不错的文件

    JAVA面试题解惑系列(一)——类的初始化顺序 JAVA 是一门面向对象的编程语言,类的初始化顺序是 JAVA 程序员和 JAVA 工程师面试中一个非常重要的知识点。本文将详细讲解类的初始化顺序,并提供了相关的测试代码,...

    45.java数组动态初始化.zip

    45.java数组动态初始化.zip45.java数组动态初始化.zip45.java数组动态初始化.zip45.java数组动态初始化.zip45.java数组动态初始化.zip45.java数组动态初始化.zip45.java数组动态初始化.zip45.java数组动态初始化.zip...

    44.java数组静态初始化.zip

    44.java数组静态初始化.zip44.java数组静态初始化.zip44.java数组静态初始化.zip44.java数组静态初始化.zip44.java数组静态初始化.zip44.java数组静态初始化.zip44.java数组静态初始化.zip44.java数组静态初始化.zip...

    JAVA面试题解惑系列(一)——类的初始化顺序-JAVA程序员JAVA工程师面试必看.pdf

    总结来说,对于Java程序员和工程师而言,了解类的初始化顺序不仅是面试中常问的问题,也是日常编程中必须掌握的基础知识。这一知识的掌握,能够帮助开发者更好地管理内存、避免初始化时的错误和数据竞争等问题,从而...

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

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

Global site tag (gtag.js) - Google Analytics