- 浏览: 56567 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
shifulong:
cywhoyi 写道现在用Javassist代理也不错的看了一 ...
java动态代理(jdk &cglib) -
cywhoyi:
现在用Javassist代理也不错的
java动态代理(jdk &cglib)
public class Student { private static List<Student> studentList = new ArrayList<Student>(); static { studentList.add(new Student(Student.S_NAME, Student.NAME, Student.AGE)); studentList.add(new Student(Student.S_NAME, Student.NAME, Student.AGE)); } private final static String S_NAME = "aaa"; // String pool. private final static String NAME = new String("bbb"); private final static Integer AGE = 11; private String sname; private String name; private Integer age; public Student(String sname, String name, Integer age) { this.sname = sname; this.name = name; this.age = age; } public static void main(String[] args) { System.out.println(studentList); } @Override public String toString() { return "Student [sname=" + sname + ", name=" + name + ", age=" + age + "]"; } }
下面是输出:
[Student [sname=aaa, name=null, age=null], Student [sname=aaa, name=null, age=null]]
按照以前的理解,不应该是这个结果的。
于是乎问了下大神,得出了以下结论:
1,静态变量声明和初始化是两个过程;
2, String字面常量有个pool, 每次有新的常量出现的时候, 先把它放入pool, 然后直接把变量引用指向pool中的位置;
3. java中的字面常量在编译的时候被替换成真实的值,具体表现为字符串常量和基本类型常量。
4.static 块java language specification是保证happen before的,也就是有顺序的。
所以代码等同于:
private static List<Student> studentList = null; private final static String S_NAME = "aaa"; // String pool. private final static String NAME = null; private final static Integer AGE = null; static { studentList = new ArrayList<Student>(); studentList.add(new Student(Student.S_NAME, Student.NAME, Student.AGE)); studentList.add(new Student(Student.S_NAME, Student.NAME, Student.AGE)); NAME = new String("bbb"); AGE = 11; }
所以输出结果可定不对啊!!!
改成下面这样就可以了,其实就是换一下声明顺序。
private static List<Student> studentList = new ArrayList<Student>(); private final static String S_NAME = "aaa"; // String pool. private final static String NAME = new String("bbb"); private final static Integer AGE = 11; static { studentList.add(new Student(Student.S_NAME, Student.NAME, Student.AGE)); studentList.add(new Student(Student.S_NAME, Student.NAME, Student.AGE)); }
输出结果
[Student [sname=aaa, name=bbb, age=11], Student [sname=aaa, name=bbb, age=11]]
自身引用自身的静态变量时才会发生上面个的情况(Student引用Student的static),
如果Student引用Teacher的静态常量就不会有上面这个问题,因为Teacher已经初始化完成所有的静态常量了。
发表评论
-
test
2016-02-26 17:45 430http://c.hiphotos.baidu.com/t ... -
java Integer的比较
2016-01-18 20:09 1029/** * A constant ... -
load过高排查
2016-01-07 19:15 1088jstack 线程的运行情况、线程的状态 load过高的 ... -
Runnable Callable Future FutrueTask ExecutorService的关系
2015-11-30 16:34 660public interface ExecutorSe ... -
单例模式以及序列化仍然单例的问题
2015-11-18 10:47 552这种方式仍然存在并发的同步阻塞问题,并且jdk1.5之 ... -
linux5种网络IO模型
2015-11-07 21:58 856看网上书上的各种解释太绕口难理解了,看到个例子挺好的。 ... -
nio学习记录 : start(buffer channel selector)
2015-11-06 22:17 725Buffer的capacity,limit,positio ... -
desgn partten : 适配器&门面
2015-11-05 11:55 533adapter adapter 一个接口转换成另一个接 ... -
java泛型中的PECS
2015-10-26 17:58 976extends List<? extends Nu ... -
spring自定义cache
2015-10-21 17:14 4509下面是一个较为详细的spring缓存的介绍 http:/ ... -
spring各种接口的作用FactoryBean、ApplicationContextAware、InitializingBean
2015-10-20 20:04 3007FactoryBean 当配置文件中<bean&g ... -
jvm调试命令
2015-10-14 15:42 464jps jps -mlv 列出当前jvm进程 ji ... -
CAS自定义线程安全的计数器
2015-10-10 17:36 2157写了一个线程安全的计数器(用锁显得多没有水平),非阻塞的,通过 ... -
java线程遇见的一个小问题(本质和线程无关都是基础知识)
2015-09-21 10:29 523猜猜下面几个程序,那个是线程安全的 NO1 public cl ... -
JUC--Parser
2015-09-08 16:27 652Java 7的并发包中推出了Phaser,其功能跟Cyclic ... -
JUC--Exchanger
2015-09-07 17:26 858Exchanger 用于线程之间数据交换,通过exchange ... -
java浮点型float遇到的一点问题
2015-04-10 16:32 643float 可以除以0,还可以不是一个数字 即Float.is ... -
java学习计划
2015-04-07 17:57 372刚入职的时候,team大神给制定的学习计划。 受益匪浅啊 ... -
购物网站(spring+mybatis+velocity+maven)项目
2015-04-03 18:06 951原文地址: http://www.iteye.com/top ... -
synchronized与static synchronized 的区别
2015-03-25 18:51 678基本上每个面试都问到了,面试命中率很大。 public cl ...
相关推荐
Java避坑指南
讲解了Java基础中常见的问题,平时不长碰见的问题,通过此文档可以让基础比较薄弱的Java程序员可以认识到一些Java开发中使用的没经验容易犯错的问题,提高大家的开发效率
Java通过JNI调用算法的一些坑
增强的for循环是在传统的for循环中增加的强大的迭代功能的循环,是在jdk1.5之后提出来的。下面这篇文章主要给大家介绍了关于Java中增强for循环的实现原理和坑的相关资料,需要的朋友可以参考下
一、学习java的前提赚钱的动力相信目前很多人学习java是因为功利性,即听说了这个行业的高薪,不要否认 二、学习java的方法学习的方法有很多,我这里只说一种
NULL 博文链接:https://renfj.iteye.com/blog/2086421
java使用mysql的escape遇到的坑
java创建和删除文件夹、文件.doc
C++造的坑Java来补,补坑的路上Java接口怎么写.pdf
这个5分当然是物有所值,我不会坑你们的亲,是女友当初想学java帮她收集的...还有运行于JBuilder的100个java实例,可以说应有尽有了,希望大家java水平更上一层楼,第一次解压无需密码,里面有一个后面文件要的密码说明
Free Spire.XLS for Java 是用于操作处理Excel文档的Java组件。开发人员使用它可以在 Java 应用程序中实现创建、操作、转换和打印 Excel 工作表,并且运行环境无需安装 Microsoft Office 或 Microsoft Excel。该类库...
之前用163邮箱发邮件时明明是成功的,但是使用中国移动自己的邮箱时,无论如何在linux服务器中都发送不成功。下面小编给大家说下我是怎么解决的,一起看下吧
java必坑指南,如何巧妙的避免空指针,合理的使用optional,计算集合接口常见坑
最基础的java知识,适用于小白,和初入java坑的小白。
这套 java面试题 主要内容是 Java Web和Web Service相关的面试题。包括sevlet tomcat jsp wb等相关面试题
Java日常开发的21个坑,你踩过几个? CAS乐观锁解决并发问题的一次实践 写代码有这些想法,同事才不会认为你是复制粘贴程序员 程序员必备:Java日期处理的十个坑 内存泄漏问题的分析和解决方案 程序员必备基础:加签...
java工作中常用技巧和坑点 教你如何填坑和使用java
Java 面试中一些常用问题的小总结.希望可以帮到大家。。
编写高质量代码:改善Java程序的151个建议, Spring 技术内幕 机器学习实践指南:案例应用解析(第2版) Java并发编程的艺术 , Java TCP_IP Socket编程(2版), 深入理解Java虚拟机(第2版), 机器学习实践指南:...
关于Java的一些资料。里面内容是全英文的。这是MIT 的授课资料。