当前位置:首页 > 开发 > 编程语言 > JDK JVM > 正文

jvm 初始化static 变量的类顺序

发表于: 2014-09-09   作者:annan211   来源:转载   浏览次数:
摘要: class Nolization{ static{ System.out.println("Nolization init"); } public static int value = 123; } class Contant extends Nolization{ static{ System.out.println(&q
 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文件之后,这两个字节码文件已经不存在任何联系了。

jvm 初始化static 变量的类顺序

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
package com.cisco.learning; class ClassOne{ //去掉static将产生StackOverflowError //因为有了静
http://www.darkmi.com/blog/archives/1917 JAVA类首次装入时,会对静态成员变量、静态初始化块、静
做个简单笔录,就当是重温下基础知识。 1.先看代码:    package com.test; public class Test {
类中变量的初始化顺序。变量这个词不一定准确,但本文的思路主要解释一个java类中初始化的一个顺序问
参考文章: Java类的初始化顺序 Java中变量的初始化 Java类有两种成员变量,一是没有static修饰的,
类成员包括: 静态变量、静态初始化块、变量、初始化块、构造器,它们的初始化顺序依次是(静态变量
第36集 java static 变量,和方法从属于类 可以用类来直接调用static属性和方法 static方法不能调用
http://www.2cto.com/kf/201204/129386.html 类的生命周期 上图展示的是类生命周期流向;在本文里,
转载自:http://www.cnblogs.com/bing198333/p/3580297.html 直接看一个例程
直接看一个例程 /*【代码1】*/ public class JvmClassTest { public static JvmClassTest OBJ = new
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号