- 浏览: 59261 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
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 487http://c.hiphotos.baidu.com/t ... -
java Integer的比较
2016-01-18 20:09 1076/** * A constant ... -
load过高排查
2016-01-07 19:15 1134jstack 线程的运行情况、线程的状态 load过高的 ... -
Runnable Callable Future FutrueTask ExecutorService的关系
2015-11-30 16:34 702public interface ExecutorSe ... -
单例模式以及序列化仍然单例的问题
2015-11-18 10:47 588这种方式仍然存在并发的同步阻塞问题,并且jdk1.5之 ... -
linux5种网络IO模型
2015-11-07 21:58 896看网上书上的各种解释太绕口难理解了,看到个例子挺好的。 ... -
nio学习记录 : start(buffer channel selector)
2015-11-06 22:17 758Buffer的capacity,limit,positio ... -
desgn partten : 适配器&门面
2015-11-05 11:55 615adapter adapter 一个接口转换成另一个接 ... -
java泛型中的PECS
2015-10-26 17:58 1028extends List<? extends Nu ... -
spring自定义cache
2015-10-21 17:14 4559下面是一个较为详细的spring缓存的介绍 http:/ ... -
spring各种接口的作用FactoryBean、ApplicationContextAware、InitializingBean
2015-10-20 20:04 3044FactoryBean 当配置文件中<bean&g ... -
jvm调试命令
2015-10-14 15:42 508jps jps -mlv 列出当前jvm进程 ji ... -
CAS自定义线程安全的计数器
2015-10-10 17:36 2211写了一个线程安全的计数器(用锁显得多没有水平),非阻塞的,通过 ... -
java线程遇见的一个小问题(本质和线程无关都是基础知识)
2015-09-21 10:29 570猜猜下面几个程序,那个是线程安全的 NO1 public cl ... -
JUC--Parser
2015-09-08 16:27 693Java 7的并发包中推出了Phaser,其功能跟Cyclic ... -
JUC--Exchanger
2015-09-07 17:26 899Exchanger 用于线程之间数据交换,通过exchange ... -
java浮点型float遇到的一点问题
2015-04-10 16:32 686float 可以除以0,还可以不是一个数字 即Float.is ... -
java学习计划
2015-04-07 17:57 442刚入职的时候,team大神给制定的学习计划。 受益匪浅啊 ... -
购物网站(spring+mybatis+velocity+maven)项目
2015-04-03 18:06 1013原文地址: http://www.iteye.com/top ... -
synchronized与static synchronized 的区别
2015-03-25 18:51 723基本上每个面试都问到了,面试命中率很大。 public cl ...
相关推荐
在Java编程语言的世界里,程序员们常常面临各种各样的陷阱和难题。...这份“Java避坑指南:Java高手笔记代码篇”应该包含了这些领域的实战经验和示例代码,为读者提供了一条避开陷阱、提升技能的道路。
在增强for循环中,Java编译器会将其转换为一个普通的for循环,使用迭代器来遍历集合或数组。迭代器会在遍历过程中维护一个索引,指向当前要遍历的元素。这样,增强for循环可以简洁地遍历集合或数组,提高编程效率。 ...
标题所指的知识点,即“C++造的坑Java来补,补坑的路上Java接口怎么写”,说明了Java接口的设计初衷之一是为了弥补C++语言中多继承带来的问题。C++支持多重继承,即一个类可以继承自多个父类,这带来了诸如菱形继承...
从给定的文件标题“Java面试中的陷阱”和描述“Java面试中一些常用问题的小总结”,我们可以提炼出一系列重要的Java知识点,这些知识点是面试官在评估候选人时常常关注的领域。下面将对这些知识点进行详细解析,以...
第一个坑:Arrays.asList 方法返回的 List 不支持增加、删除操作 Arrays.asList 方法返回的 List 并不是我们常用的 java.util.ArrayList,而是 Arrays 的静态内部类 java.util.Arrays.ArrayList,该类继承自抽象类 ...
标签《ES Java API 中文文档》强调了文档的内容属性,它属于ElasticSearch的一个重要组成部分,即用Java语言进行数据交互和操作的应用程序接口部分。 从部分内容中可以提取出以下知识点: 1. **Transport Client**...
这个5分当然是物有所值,我不会坑你们的亲,是女友当初想学java帮她收集的...还有运行于JBuilder的100个java实例,可以说应有尽有了,希望大家java水平更上一层楼,第一次解压无需密码,里面有一个后面文件要的密码说明
Free Spire.XLS for Java 是用于操作处理Excel文档的Java组件。开发人员使用它可以在 Java 应用程序中实现创建、操作、转换和打印 Excel 工作表,并且运行环境无需安装 Microsoft Office 或 Microsoft Excel。该类库...
在下面的示例代码中,我们将看到一个不区分大小写的字符串类的定义。这是一个反例,违反了对称性。 ```java public class CaseInsensitiveString { private final String s; public CaseInsensitiveString...
小程序毕业设计,小程序课程设计,含有代码注释,新手也可看懂。毕业设计、期末大作业、课程设计、高分必看,下载下来,简单部署,就可以使用。 包含:项目源码、数据库脚本、软件工具等,该项目可以作为毕设、课程...
例如,当你声明`String s = "Hello"`时,`s`并不是一个对象,而是指向一个字符串对象的引用。这意味着,字符串是不可变的,因此当你执行`s += "!"`时,实际上是创建了一个新的字符串对象,而`s`的引用被更新为新对象...
最基础的java知识,适用于小白,和初入java坑的小白。
Java日常开发的21个坑,你踩过几个? CAS乐观锁解决并发问题的一次实践 写代码有这些想法,同事才不会认为你是复制粘贴程序员 程序员必备:Java日期处理的十个坑 内存泄漏问题的分析和解决方案 程序员必备基础:加签...
编写高质量代码:改善Java程序的151个建议, Spring 技术内幕 机器学习实践指南:案例应用解析(第2版) Java并发编程的艺术 , Java TCP_IP Socket编程(2版), 深入理解Java虚拟机(第2版), 机器学习实践指南:...
Java 毕业设计,小程序毕业设计,小程序课程设计,含有代码注释,新手也可看懂。毕业设计、期末大作业、课程设计、高分必看,下载下来,简单部署,就可以使用。 包含:项目源码、数据库脚本、软件工具等,该项目...
Java 毕业设计,小程序毕业设计,小程序课程设计,含有代码注释,新手也可看懂。毕业设计、期末大作业、课程设计、高分必看,下载下来,简单部署,就可以使用。 包含:项目源码、数据库脚本、软件工具等,该项目...
Java毕设,小程序毕业设计,小程序课程设计,含有代码注释,新手也可看懂。毕业设计、期末大作业、课程设计、高分必看,下载下来,简单部署,就可以使用。 包含:项目源码、数据库脚本、软件工具等,该项目可以作为...
JAVA高并发.xmind
若指定参数为unicode,则转换后前二字节为-2,-1,后两字节为一个字符(高位在前,低位在后);而DotNET转换后,无前二字节,低位在前,高位在后。因此,为与DotNET一致,Java用unicode参数取得字节数组后须再次处理...
比如对大数据、分布式、高并发类的专题进行攻克时,立即遇到针对java.lang包中线程类的学习,但线程类的学习并不像JDBC一样简单,学习曲线陡峭,多弯路与“坑”。要学习这些热点技术,Java多线程技术避无可避。而...