`
annan211
  • 浏览: 445525 次
  • 性别: 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提高篇之关键字static

    在JVM加载一个类的时候,若该类存在static修饰的成员变量和成员方法,则会为这些成员变量和成员方法在固定的位置开辟一个固定大小的内存区域,有了这些“固定”的特性,那么JVM可以非常方便地访问他们。同时如果静态...

    J2SE(javaSE基础知识).doc

    java简介、java不同版本、java特点、jdk、第一个程序、jdk、jre、jvm、eclipse配置、注释、标识符、变量、数据类型、运算符、分支语句、命名规范、循环语句、数组、main方法、面向对象、成员变量和局部变量、构造...

    Java对象与内存管理

    1、实例变量和类变量的内存分配 ...  2、类变量的初始化时机总是出于实例变量的初始化之前  我们先看下下面三段代码:  1)因为两个实例变量都是在创建变量的时候才开始分配空间,此时num2还没有

    java模拟题库面试题目64道经典答题及答案

    在 Java 7 之前,你可以通过使用静态初始化运行 Java 类。但是,从 Java 7 开始就行不 通了。 3. String 类为什么是 final 的。 主要是为了“效率”和“安全性”的缘故。若 String 允许被继承, 由于它的高度被 ...

    突破程序员基本功的16课.part2

    2.1.3 类变量的初始化时机 2.2 父类构造器 2.2.1 隐式调用和显式调用 2.2.2 访问子类对象的实例变量 2.2.3 调用被子类重写的方法 2.3 父子实例的内存控制 2.3.1 继承成员变量和继承方法的区别 2.3.2 内存...

    【05-面向对象(下)】

    •成员变量是随类的初始化或对象初始化而初始化的。final修饰的成员变量必须由程序员指定初始值。 •对于类属性而言,要么在静态初始化中初始化,要么在声明该属性时初始化。 •对于实例属性,要么在普通初始化块...

    javacore:java核心 运算符,控制语句,函数,异常,集合,线程,数组,IO流,网路编程,设计模式,java8,面试相关

    Java基础 java控制流程语句 数据交换 左(右)移 加密 java控制流程语句 switch语句 季节判断 while循环 1+...+100 do while循环 ...jvm类加载顺序决定代码执行顺序 super关键字 方法重写 instanceof关键字 fi

    Java入门教程(微学苑)-part1

    3.15 作为方法名来初始化对象 50 3.16 作为参数传递 51 3.17 Java方法重载 52 3.18 Java类的基本运行顺序 53 3.19 Java包装类、拆箱和装箱详解 54 3.20 包装类的应用 54 3.20.1.1 1) 实现 int 和 Integer 的相互转换...

    玩转Java虚拟机(一)

    从今天开始打卡学习JVM,第一天 本人学习过程中所整理的代码,源码地址 – 类加载 在Java代码中,类型的加载、连接与初始化过程都是在程序运行期间完成的 加载:查找并加载类的二进制数据,具体...初始化:为类的静态变

    Java知识复习(前篇)

    拆箱装箱拆箱自动装箱与手动装箱String基本概要String与StringBuffer和StringBuilderString pool参数传递重点类型转换基本概要float 与double的恩怨智能整数switch基本概要关键字finalstatic类内变量和方法初始化...

    程序员面试刷题的书哪个好-thinkingInJava:学习《thinkinginjava》一书

    3.当一个类的成员变量是基本类型时,JVM会默认将其初始化为对应的初值,但是最好自行进行初始化。 成员变量: 基本类型的初始化值是0, 引用的初始化值是null。 局部变量:必须给一个初始化的值,不然编译会报错。 4...

    JAVA基础课程讲义

    静态初始化块(经常用来初始化类,加载类信息时执行!) 67 package 68 JDK中的主要包 68 import 68 eclipse的使用 69 继承(extend, inheritance) 70 为什么需要继承?继承的作用? 70 继承介绍 70 如何实现继承? ...

    java 面试题 总结

    Static Nested Class是被声明为静态(static)的内部类,它可以不依赖于外部类实例被实例化。而通常的内部类需要在外部类实例化后才能实例化。 22、JSP中动态INCLUDE与静态INCLUDE的区别? 动态INCLUDE用jsp:...

    java编程基础,应用与实例

    5.12 类的初始化 83 5.12.1 静态块 84 5.12.2 实例块 84 5.13 巩固练习 85 第6章 数组 86 6.1 基本数据类型数组 86 6.2 一维数组的初始化 88 6.3 对象数组 88 6.4 二维数组 91 6.5 三维数组 95...

    三个修饰符(abstract、static、final)

    (3) 抽象类可以定义成员变量和成员方法 (4) 抽象类可以有构造,但不用于new对象,而是用于子类创建对象jvm默认创建父类对象应用 abstract修饰方法 (1) 被 abstract 修饰的方法称为抽象方法 (2) 抽象方法只有声明部分,...

    java8看不到源码-java8-plugin-persitent-local-vars:javac(openJDK8)的插件,增加了对Jav

    目前,该变量在以下情况下初始化: 类被加载(对于静态函数) 或者在创建对象时(例如方法) 在插件的未来迭代中,可能支持仅在第一次调用该方法时才支持初始化。 因此,由于这个插件不能改变javac解析器,只能改变...

    AIC的Java课程1-6章

     弄清构造函数和终结方法在继承层次结构中的调用顺序,强调子类必须调用超类的构造函数分配空间和初始化超类数据。  掌握方法重写(override)的基本要求。  理解和使用关键字final。  理解包的...

    JAVA面试题最全集

    静态变量和静态方法的意义,如何引用一个类的静态变量或者静态方法? 50.JAVA语言如何进行异常处理,关键字:thorws,throw,try,catch,finally 51.Object类(或者其子类)的finalize()方法在什么情况下被调用? 52....

    超级有影响力霸气的Java面试题大全文档

    Static Nested Class是被声明为静态(static)的内部类,它可以不依赖于外部类实例被实例化。而通常的内部类需要在外部类实例化后才能实例化。 25、JSP中动态INCLUDE与静态INCLUDE的区别?  动态INCLUDE用jsp:...

Global site tag (gtag.js) - Google Analytics