今天遇到下面的代码,感觉很奇怪,特意记录下:
代码如下:
public class Test { private static List<Test> objs = new ArrayList<Test>(); static { objs.add(new Test(Test.S_NAME,Test.NAME,Test.COUNT)); objs.add(new Test(Test.S_NAME,Test.NAME,Test.COUNT)); } private final static String S_NAME = "aaa"; private final static String NAME = new String("bbb"); private final static Long COUNT = 1l; private String name; private String title; private Long count; public Test(String name,String title,Long count) { this.name = name; this.title = title; this.count = count; } public static void main(String[] args) { System.out.println(objs); } @Override public String toString() { return "Test [name=" + name + ", title=" + title + ", count=" + count + "]"; } }
运行结果如下:
感觉到特别奇怪,特意解释下:
1,静态变量声明和初始化是两个过程;
2, String字面常量有个pool, 每次有新的常量出现的时候, 先把它放入pool, 然后直接把变量引用指向pool中的位置;
3. java中的字面常量在编译的时候被替换成真实的值,具体表现为字符串常量和基本类型常量。
4, static 块java language specification是保证happen before的,也就是有顺序的。
所以代码等同于:
private static List<Test> objs = null; private final static String S_NAME = "aaa"; //String pool. private final static String NAME = null; private final static Long COUNT = null; static { objs = new ArrayList<Test>(); objs.add(new Test(Test.S_NAME,Test.NAME,Test.COUNT)); objs.add(new Test(Test.S_NAME,Test.NAME,Test.COUNT)); NAME = = new String("bbb"); COUNT = = 1l; }
这样就很好理解了。变量的声明和初始化是两个过程,这样就能理解NAME为什么是null了,而S_NAME有值。
相关推荐
java静态代码块与非静态代码块.doc
java静态代码块与非静态代码块参照.pdf
本案例是一个通过静态代码块获取资源属性文件的代码块,从而来提高应用性能。。
主要介绍了Java静态代码块作用及执行顺序解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
主要介绍了Java静态代码块加载驱动代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
主要介绍了java 代码块与静态代码块加载顺序的相关资料,需要的朋友可以参考下
下面小编就为大家带来一篇Java 普通代码块静态代码块执行顺序(实例讲解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
Java的静态代码块、非静态代码块、构造函数的简单的java代码
其中静态代码在类的初始化阶段被初始化。而非静态代码则在类的使用阶段(也是实例化一个类的时候)才会被初始化。 静态变量 可以将静态变量理解为类变量(与对象无关),而实例变量则属于一个特定的对象...
在Java中静态代码块的使用,及静态代码块的相关基础知识
Java常见笔试、面试题目深度剖析,方法重写详解、静态代码块与构造方法执行顺序问题
关于 static 静态代码块的一点东西 静态代码块(static block ),不包含在任何方法体中当类被载入时,自动执行静态代码块,且只被执行一次经常用于类属性的初始化。 这是网上通行的关于静态代码块的定义。 在Java...
java 静态块实例块构造器调用在继承中的调用顺序,包括代码及注释
1 静态变量,静态代码块(类加载时执行,类不加载不执行) 2 实例变量,实例代码块(创建对象时才执行,不创建对象不执行) 3 构造函数,(创建对象时执行完2后再执行构造函数,不管构造函数是public还是private...
主要介绍了Java构造代码块,静态代码块,结合实例形式分析了Java构造代码块,静态代码块的功能、原理、用法及操作注意事项,需要的朋友可以参考下
主要介绍了Java 中普通代码块,构造代码块,静态代码块区别及代码示例的相关资料,需要的朋友可以参考下
对静态代码块以及构造函数的执行先后顺序,一直很迷惑,直到最近看到一段代码,发现终于弄懂了,所以这篇文章主要给大家介绍了关于如何判断java中静态代码块与构造方法的执行顺序的相关资料,需要的朋友可以参考下。
构造代码块和静态代码块的执行时机
基于网络的投票系统,主要使用ssh框架开发实现,有需要的朋友下载吧,可以直接运行的!
下面小编就为大家带来一篇java中的静态代码块、构造代码块、构造方法详解。小编觉得挺好的,现在分享给大家。给大家一个参考。一起跟随小编过来看看吧