- 浏览: 59174 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
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 486http://c.hiphotos.baidu.com/t ... -
java Integer的比较
2016-01-18 20:09 1075/** * A constant ... -
load过高排查
2016-01-07 19:15 1133jstack 线程的运行情况、线程的状态 load过高的 ... -
Runnable Callable Future FutrueTask ExecutorService的关系
2015-11-30 16:34 701public interface ExecutorSe ... -
单例模式以及序列化仍然单例的问题
2015-11-18 10:47 587这种方式仍然存在并发的同步阻塞问题,并且jdk1.5之 ... -
linux5种网络IO模型
2015-11-07 21:58 896看网上书上的各种解释太绕口难理解了,看到个例子挺好的。 ... -
nio学习记录 : start(buffer channel selector)
2015-11-06 22:17 756Buffer的capacity,limit,positio ... -
desgn partten : 适配器&门面
2015-11-05 11:55 613adapter adapter 一个接口转换成另一个接 ... -
java泛型中的PECS
2015-10-26 17:58 1026extends List<? extends Nu ... -
spring自定义cache
2015-10-21 17:14 4558下面是一个较为详细的spring缓存的介绍 http:/ ... -
spring各种接口的作用FactoryBean、ApplicationContextAware、InitializingBean
2015-10-20 20:04 3042FactoryBean 当配置文件中<bean&g ... -
jvm调试命令
2015-10-14 15:42 507jps jps -mlv 列出当前jvm进程 ji ... -
CAS自定义线程安全的计数器
2015-10-10 17:36 2210写了一个线程安全的计数器(用锁显得多没有水平),非阻塞的,通过 ... -
java线程遇见的一个小问题(本质和线程无关都是基础知识)
2015-09-21 10:29 569猜猜下面几个程序,那个是线程安全的 NO1 public cl ... -
JUC--Parser
2015-09-08 16:27 692Java 7的并发包中推出了Phaser,其功能跟Cyclic ... -
JUC--Exchanger
2015-09-07 17:26 897Exchanger 用于线程之间数据交换,通过exchange ... -
java浮点型float遇到的一点问题
2015-04-10 16:32 684float 可以除以0,还可以不是一个数字 即Float.is ... -
java学习计划
2015-04-07 17:57 437刚入职的时候,team大神给制定的学习计划。 受益匪浅啊 ... -
购物网站(spring+mybatis+velocity+maven)项目
2015-04-03 18:06 1011原文地址: http://www.iteye.com/top ... -
synchronized与static synchronized 的区别
2015-03-25 18:51 722基本上每个面试都问到了,面试命中率很大。 public cl ...
相关推荐
从给定的文件标题“Java面试中的陷阱”和描述“Java面试中一些常用问题的小总结”,我们可以提炼出一系列重要的Java知识点,这些知识点是面试官在评估候选人时常常关注的领域。下面将对这些知识点进行详细解析,以...
`char`型变量可以存储一个中文汉字,因为Java中的`char`类型采用Unicode编码,占用两个字节,足够存储一个中文字符。 **1.8 最有效率的乘法计算** 最有效率的方法是使用位运算符`来进行乘法计算。例如,`2 * 8`...
所以很少存在简单重复的工作,加上Java 代码的精炼性和面向对象纯洁性(设计模式是 java 的灵魂),编程工作将变成一个让你时刻 体验创造快感的激动人心的过程. 为能和大家能共同探讨"设计模式",我将自己在学习中的心得...
这只是Java开发中“常见错误100例”中的一小部分。通过不断学习和实践,理解这些陷阱,并掌握正确的解决策略,能显著提高代码质量和效率,避免掉入这些"坑"。在实际编程过程中,不断积累经验,使用有效的工具和最佳...
基于springboot大学生就业信息管理系统源码数据库文档.zip
基于java的驾校收支管理可视化平台的开题报告
时间序列 原木 间隔5秒钟 20241120
毕业设计&课设_基于 Vue 的电影在线预订与管理系统:后台 Java(SSM)代码,为毕业设计项目.zip
基于springboot课件通中小学教学课件共享平台源码数据库文档.zip
基于java的网上购物商城的开题报告
Delphi人脸检测与识别Demo1fdef-main.zip
基于java的咖啡在线销售系统的开题报告
基于java的自助医疗服务系统的开题报告.docx
内容概要:本文档全面介绍了Visual Basic(VB)编程语言的基础知识和高级应用。首先概述了VB的基本特性和开发环境,随后详细讲述了VB的数据类型、变量、运算符、控制结构、数组、过程与函数、变量作用域等内容。接着介绍了窗体设计、控件使用、菜单与工具栏的设计,文件操作、数据库访问等关键知识点。最后讨论了VB的学习方法、发展历史及其在桌面应用、Web应用、数据库应用、游戏开发和自动化脚本编写等领域的广泛应用前景。 适合人群:初学者和中级程序员,尤其是希望快速掌握Windows桌面应用开发的人群。 使用场景及目标:①掌握VB的基础语法和开发环境;②学会使用VB创建复杂的用户界面和功能完整的应用程序;③理解数据库操作、文件管理和网络编程等高级主题。 其他说明:Visual Basic是一种简单易学且功能强大的编程语言,尤其适合用于开发Windows桌面应用。文中不仅覆盖了基础知识,还包括了大量的实用案例和技术细节,帮助读者快速提升编程技能。
基于java的疫情期间高校防控系统开题报告.docx
基于springboot+vue社区老年人帮扶系统源码数据库文档.zip
基于java的超市商品管理系统的开题报告.docx
基于SpringBoot房屋买卖平台源码数据库文档.zip
xdu限通院23微处理器系统与应用大作业(两只老虎),适应于汇编语言keil软件,
<项目介绍> - 新闻类网站系统,基于SSM(Spring、Spring MVC、MyBatis)+MySQL开发,高分成品毕业设计,附带往届论文 - 不懂运行,下载完可以私聊问,可远程教学 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 --------