今天遇到下面的代码,感觉很奇怪,特意记录下:

代码如下:

public class Test {

private static List objs = new ArrayList();

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 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();

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 静态代码块_JAVA静态代码块相关推荐

  1. java自由块_JAVA 静态的自由块和非静态的自由块

    java中的自由块分为静态的自由块和非静态的自由块,这两种的执行是有区别的. 非静态自由块的执行时间是:在执行构造函数之前. 静态自由块的执行时间是:class文件加载时执行. 执行的时间不同,造成的 ...

  2. java 代码同步_Java同步代码块 转

    Java 同步块(synchronized block)用来标记方法或者代码块是同步的.Java同步块用来避免竞争.本文介绍以下内容: Java同步关键字(synchronzied) 实例方法同步 静 ...

  3. java 静态初始化数据_Java 静态数据初始化的示例代码

    无论创建多少个对象,静态数据都只占用一份存储区域.static关键字不能应用于局部变量,因此它只能作用于域.如果一个域是静态的基本类型域,且也没有对它进行初始化,那么它就会获得基本类型的标准初始值:如 ...

  4. java静态变量定义_java静态变量、静态方法和静态代码段

    先上实例 public classTestStatic {public static String staticString = "this is a static String" ...

  5. java同步方法同步块_java 同步代码块与同步方法

    同步代码块 synchronized(obj) {//代码块 } obj 为同步监视器,以上代码的含义为:线程开始执行同步代码块(中的代码)之前,必须先获得对同步监视器的锁定. 代码块中的代码是执行代 ...

  6. java 静态变量声明_java静态变量怎么声明?

    展开全部 个人的总结 1 静态变量e69da5e6ba9062616964757a686964616f31333337616564只有一份被类的所有实例共享 2 静态变量的声明在编译时已经明确了内存的 ...

  7. java线程代码实现_Java 多线程代码实现讲解

    作为一个完全面向对象的语言,Java提供了类 java.lang.Thread 来方便多线程编程,这个类提供了大量的方法来方便我们控制自己的各个线程.那么如何提供给 Java 我们要线程执行的代码呢? ...

  8. java for循环效率优化_java 优雅代码for循环 之性能调优

    大家在工作中,用到最多的就是for循环了,但是你知道如何写for循环可以提高系统的性能呢? 我从以下几个方面对如何写for循环给大家几个事例,希望可以帮到你们 原始代码 优化过的代码 对比结果 在循环 ...

  9. Java 初始化 代码块_Java中初始化块详解及实例代码

    Java中初始化块详解 在Java中,有两种初始化块:静态初始化块和非静态初始化块. 静态初始化块:使用static定义,当类装载到系统时执行一次.若在静态初始化块中想初始化变量,那仅能初始化类变量, ...

最新文章

  1. linux c++ 警告: ISO C++ forbids converting a string constant to char*
  2. 【5.2】事务的隔离级别
  3. WebView点击加载的页面中的按钮时不弹出新窗口以及在加载后执行javascript
  4. Eigen与Matlab语法及语义辞典
  5. Powershell 最大值堆栈实现
  6. 上新了三星堆!“金面具”网友P图大赛又双叒开始了……
  7. 【图像风格转换】项目参考资料总结
  8. 《Oracle DBA工作笔记》第一章
  9. PAT---数字分类
  10. C#开发WPF/Silverlight动画及游戏系列教程(Game Tutorial):(十七) 完美精灵之八面玲珑(WPF Only)①...
  11. 上传excel,并保存excel内容
  12. Java、JSP公文流转系统分析与实现
  13. 云计算认证系列:CKA认证
  14. ubuntu 开发java_Ubuntu下搭建java开发环境
  15. 最新论文阅读(17)--Pyramidal RoR for Image Classification
  16. 珍重了,我亲爱的朋友们
  17. 转:人生最优策略:你发现自己的天赋了吗?
  18. 详细的辅助开发教程,从入门到精通
  19. Windows下安装Python pyramid,并运行一个pyramid的Helloworld项目
  20. 【51单片机】MAX7219 LED点阵GUI设计

热门文章

  1. extern 使用方法具体解释
  2. Fast Image Cache – iOS 应用程序高性能图片缓存
  3. OPENCV2.2移植说明
  4. 小议程序员编写技术文档
  5. Spring.NET学习笔记12——面向切面编程(基础篇) Level 300
  6. leetcode 153. 寻找旋转排序数组中的最小值(二分查找)
  7. leetcode107. 二叉树的层次遍历 II
  8. angular示例_用示例解释Angular动画
  9. css注释_CSS注释示例–如何注释CSS
  10. 开源短地址_如何在短短5分钟内完成您的第一个开源贡献