`
annan211
  • 浏览: 463111 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

jvm 初始化static 变量的类顺序

    博客分类:
  • jvm
 
阅读更多
 class Nolization{
	static{
		System.out.println("Nolization init");
	}

	public static int  value = 123;
}

 class Contant extends Nolization{

	static{
		System.out.println("Contant init");
	}
}

public class ContantClass {
	public static void main(String[] args) {
		System.out.println(Contant.value);
	}
}

上面这段代码的执行结果是 Nolization init
123
并没有输出 Contant init,这是因为 jvm 对于 静态字段,只有直接定义这个字段的类才会被初始化。

再看下面这段代码
  class Nolization{
	static{
		System.out.println("Nolization init");
	}

	public static final int  value = 123;
}

 class Contant extends Nolization{

	static{
		System.out.println("Contant init");
	}
}

public class ContantClass {
	public static void main(String[] args) {
		System.out.println(Contant.value);
	}
}


相比于上段代码,仅仅是将value 从public static int 改为 public static final int ,输出的结果变成了 123,不再输出任何类的初始化信息。

这是因为 jvm 在编译阶段 将常量 123 存储到了 ContantClass 的常量池中,对 Contant.value 的引用实际都转化为 ContantClass  对自身常量的引用了,也就是说 ContantClass 的class文件中并不存在 Nolization 的任何调用入口,在编译成class文件之后,这两个字节码文件已经不存在任何联系了。
分享到:
评论

相关推荐

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

    Java中,类变量(static变量)的初始化顺序遵循以下规则: 1. 首先,执行父类的静态初始化块(方法),如果有的话。 2. 然后,执行子类的静态初始化块。 3. 静态变量的初始化顺序取决于它们在代码中声明的顺序,而...

    java程序初始化顺序

    - 静态初始化块(static{}):如果类中存在静态初始化块,该块的代码会在类加载后的准备阶段执行,用于初始化静态变量或执行其他静态设置任务。 - 静态变量的赋值:接着,静态变量会被赋予它们的初始值,这可以是...

    java中类的初始化顺序

    1. **静态成员变量的初始化**:当类被加载到JVM中时,静态成员变量首先被初始化。 2. **静态初始化块的执行**:紧随静态成员变量之后,静态初始化块被执行。 3. **父类静态成员变量及初始化块**:如果当前类继承自另...

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

    静态初始化块是以`static`关键字标识的代码块,它在类被加载到Java虚拟机(JVM)时执行,且只执行一次。静态初始化块常用于设置类级别的变量,或者执行只应执行一次的初始化操作。例如,如果一个类需要在程序运行前...

    java中的static变量,方法,代码块

    Static变量 `static`变量,亦称为静态变量或类变量,与实例变量相对。其最显著的特点在于,无论创建多少个该类的实例,`static`变量在内存中仅存在一份拷贝,这意味着所有实例共享同一份变量值。这不仅节约了内存...

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

    类的静态变量初始化是有序的,遵循类文件中的顺序,从上到下依次初始化。这一点在面试中可能会被问及,例如在给定的代码片段中: ```java public class Test { public static int a = 0; public static int b ; ...

    Java初始化块Java初始化块.doc

    静态初始化块主要用于初始化类级别的变量,即静态变量。由于它是在类加载时执行,所以它总是在任何对象创建之前运行。静态初始化块不能访问非静态成员,包括实例属性和实例方法,因为它们依赖于对象实例,而静态初始...

    java对象的初始化顺序[参考].pdf

    - 在类加载阶段,按顺序初始化静态成员变量、静态初始化块。 - 在实例化过程中,按顺序初始化实例成员变量、实例成员函数,最后调用构造函数。 了解这个顺序对于理解和调试涉及多层继承和复杂初始化逻辑的Java代码...

    Java static静态初始快

    `static`静态初始化块是用来初始化类级别的变量,也就是说,这些变量是属于类本身,而不是类的实例。当我们讨论“Java static静态初始化块”时,我们关注的是如何在类加载时执行特定的初始化代码。 首先,让我们...

    JVM实战-JVM类加载机制案例分析

    实验将结合具体的Java程序实例,运用单例模式对静态变量和对象进行初始化,以此来加深对类加载机制的理解。 #### 实验环境设置 为了确保实验的顺利进行,需要搭建合适的硬件和软件环境。硬件方面,建议使用一台...

    Java提高篇之关键字static

    3. **静态代码块(Static Blocks)**:在类加载时执行,可以用于初始化静态变量或执行其他类级别的初始化操作。它可以放在类的任何位置。 尽管`static`有很多用途,但也有一些限制: 1. 静态成员只能访问其他静态...

    Java类加载初始化的过程及顺序

    5. 初始化(Initialization):在这个阶段,JVM会执行类的静态初始化代码,例如static块和静态变量的赋值。 类加载的顺序是按照父类到子类的顺序进行的,即父类的静态变量会先被初始化,接着是子类的静态变量。然后...

    深入理解final变量的初始化

    - **实例变量**:实例变量的初始化顺序与它们在类声明中的顺序一致,同时考虑初始化块。在`InitOrder`的例子中,`c1`的初始化块在`d1`之前,所以`c1`先被初始化。 5. **错误和限制**: - 当尝试在初始化块中引用...

    简单了解java中静态初始化块的执行顺序

    在实际开发中,了解静态初始化块的执行顺序非常重要,否则可能会导致类的静态变量和静态方法不能正确地初始化。 下面是一个简单的示例代码,用于演示Java中静态初始化块的执行顺序: ```java public class Test1 { ...

    Java类执行顺序详解+实例(阿里面试题)+详细讲解+流程图

    总结来说,Java类的执行顺序涉及到类加载、验证、准备和初始化四个关键步骤,这些步骤在JVM内部协同工作,确保代码的正确性和安全性。理解这些基础知识对于编写高效、可靠的Java程序至关重要,也是面试中常见的技术...

    深入java虚拟机加载初始化

    在本例中,由于`Singleton`类中`singleton`变量的初始化发生在类初始化阶段之前,这意味着在`Singleton`对象被创建时,静态变量`a`和`b`尚未被初始化。因此,`a++`和`b++`实际上是在默认值的基础上进行的,即`a`的...

    Java中的Static块与静态方法

    静态块,也被称为静态初始化器,是在类加载时自动执行的一段代码,用于初始化类的静态变量或执行一次性的设置工作。静态块可以包含任意的Java语句,并且会在类的任何实例被创建之前执行。与静态方法不同,静态块不是...

    JVM类加载机制1

    此外,如果类中有final static变量,它们在准备阶段已经初始化。 4. 类的生命周期: 类的生命周期包括加载、验证、准备、初始化和卸载。卸载通常发生在JVM运行时内存资源紧张时,会回收无用的类,但这在标准Java...

    学习java静态数据初始化.doc

    静态初始化通过`static`关键字标记,可以用于声明静态变量、静态方法或静态代码块。 #### 二、静态初始化的过程 1. **静态初始化的时机**: - 当类首次被加载到JVM中时。 - 当第一次访问该类的静态成员(字段或...

    图文详解Java中class的初始化顺序

    2. 随后初始化`B`类的静态变量,包括`ss2`和`a`,这会间接触发`A`类的静态初始化,打印出"A的static代码块..."和"A的static变量..."。 3. 接下来,`A`类的成员变量`s1`和`s2`被初始化,分别调用`prtString`并打印...

Global site tag (gtag.js) - Google Analytics