java 静态代码块_JAVA静态代码块
今天遇到下面的代码,感觉很奇怪,特意记录下:
代码如下:
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静态代码块相关推荐
- java自由块_JAVA 静态的自由块和非静态的自由块
java中的自由块分为静态的自由块和非静态的自由块,这两种的执行是有区别的. 非静态自由块的执行时间是:在执行构造函数之前. 静态自由块的执行时间是:class文件加载时执行. 执行的时间不同,造成的 ...
- java 代码同步_Java同步代码块 转
Java 同步块(synchronized block)用来标记方法或者代码块是同步的.Java同步块用来避免竞争.本文介绍以下内容: Java同步关键字(synchronzied) 实例方法同步 静 ...
- java 静态初始化数据_Java 静态数据初始化的示例代码
无论创建多少个对象,静态数据都只占用一份存储区域.static关键字不能应用于局部变量,因此它只能作用于域.如果一个域是静态的基本类型域,且也没有对它进行初始化,那么它就会获得基本类型的标准初始值:如 ...
- java静态变量定义_java静态变量、静态方法和静态代码段
先上实例 public classTestStatic {public static String staticString = "this is a static String" ...
- java同步方法同步块_java 同步代码块与同步方法
同步代码块 synchronized(obj) {//代码块 } obj 为同步监视器,以上代码的含义为:线程开始执行同步代码块(中的代码)之前,必须先获得对同步监视器的锁定. 代码块中的代码是执行代 ...
- java 静态变量声明_java静态变量怎么声明?
展开全部 个人的总结 1 静态变量e69da5e6ba9062616964757a686964616f31333337616564只有一份被类的所有实例共享 2 静态变量的声明在编译时已经明确了内存的 ...
- java线程代码实现_Java 多线程代码实现讲解
作为一个完全面向对象的语言,Java提供了类 java.lang.Thread 来方便多线程编程,这个类提供了大量的方法来方便我们控制自己的各个线程.那么如何提供给 Java 我们要线程执行的代码呢? ...
- java for循环效率优化_java 优雅代码for循环 之性能调优
大家在工作中,用到最多的就是for循环了,但是你知道如何写for循环可以提高系统的性能呢? 我从以下几个方面对如何写for循环给大家几个事例,希望可以帮到你们 原始代码 优化过的代码 对比结果 在循环 ...
- Java 初始化 代码块_Java中初始化块详解及实例代码
Java中初始化块详解 在Java中,有两种初始化块:静态初始化块和非静态初始化块. 静态初始化块:使用static定义,当类装载到系统时执行一次.若在静态初始化块中想初始化变量,那仅能初始化类变量, ...
最新文章
- linux c++ 警告: ISO C++ forbids converting a string constant to char*
- 【5.2】事务的隔离级别
- WebView点击加载的页面中的按钮时不弹出新窗口以及在加载后执行javascript
- Eigen与Matlab语法及语义辞典
- Powershell 最大值堆栈实现
- 上新了三星堆!“金面具”网友P图大赛又双叒开始了……
- 【图像风格转换】项目参考资料总结
- 《Oracle DBA工作笔记》第一章
- PAT---数字分类
- C#开发WPF/Silverlight动画及游戏系列教程(Game Tutorial):(十七) 完美精灵之八面玲珑(WPF Only)①...
- 上传excel,并保存excel内容
- Java、JSP公文流转系统分析与实现
- 云计算认证系列:CKA认证
- ubuntu 开发java_Ubuntu下搭建java开发环境
- 最新论文阅读(17)--Pyramidal RoR for Image Classification
- 珍重了,我亲爱的朋友们
- 转:人生最优策略:你发现自己的天赋了吗?
- 详细的辅助开发教程,从入门到精通
- Windows下安装Python pyramid,并运行一个pyramid的Helloworld项目
- 【51单片机】MAX7219 LED点阵GUI设计
热门文章
- extern 使用方法具体解释
- Fast Image Cache – iOS 应用程序高性能图片缓存
- OPENCV2.2移植说明
- 小议程序员编写技术文档
- Spring.NET学习笔记12——面向切面编程(基础篇) Level 300
- leetcode 153. 寻找旋转排序数组中的最小值(二分查找)
- leetcode107. 二叉树的层次遍历 II
- angular示例_用示例解释Angular动画
- css注释_CSS注释示例–如何注释CSS
- 开源短地址_如何在短短5分钟内完成您的第一个开源贡献