- 浏览: 234378 次
- 性别:
- 来自: 北京
最新评论
-
_xiong_mao_1:
又很好的理解了一个概念,谢谢博主!
[转]JNDI的一篇文章 -
驭乐MJ:
很好!学习了!
[转]JNDI的一篇文章 -
u012566958:
mark
同步和异步 -
xiaoyao3857:
这个倒有些启发,不过博主如果能说明为什么上面的程序运行结果是那 ...
java多线程复习 -
xiangjun_yu:
顶mark
Log4j输出格式控制
下面代码的结果是什么:
这道题目咋看很简单,就是考察java初始化的顺序,但是很容易做错(我就做错了),结果应该是1、0java 代码
- public class Test {
- private static Test test = new Test();
- public static int num1;
- public static int num2=0;
- private Test(){
- num1++;
- num2++;
- }
- public static Test getInstance(){
- return test;
- }
- public static void main(String[] args) {
- Test test = Test.getInstance();
- System.out.println(test.num1);
- System.out.println(test.num2);
- }
- }
按照java初始化的顺序:首先静态初始化,然后定义初始化,然后是构造函数初始化,很简单吗,于是乎没张脑子般就写出了结果:1、1
分解一下这段代码执行的过程:
java 代码
- Test test = Test.getInstance();
java虚拟机看到需要用到Test了,于是开始满世界的找寻Test,黄天不负有心人,它终于找到了Test.class,然后开始加载......
然后要对Test打扮一番,好让她出去见人啊,于是开始初始化:
初始化顺序的总规则:
首先静态初始化,然后定义初始化,然后是构造函数初始化;
静态分为两种:
1、静态的成员变量
2、静态代码块 static{}
一般来说首先初始化静态类变量,然后初始化静态代码块。
如果某个类有父类:
那么初始化顺序是:
1、对父类进行静态初始化(初始化父类的静态成员变量或者静态代码块)
2、对子类进行静态初始化(初始化父类的静态成员变量或者静态代码块)
3、对父类进行定义初始化(初始化父类的成员变量)
4、对父类进行构造函数初始化
5、对子类进行定义初始化(初始化子类的成员变量)
6、对子类进行构造函数初始化
注意:jvm只在首次使用某个类的时候对其类变量进行一次初始化!
回到正题,jvm初始化Test的时候也是按照上面的顺序进行的:
1、ClassLoader加载Test.class,我自己理解这个时候Test.class中的三个静态变量已经被装载进内存,并分别赋予了初始值
null,0,0 (不知道这样理解对不对)
2、按照顺序对Test.class进行静态初始化,注意这里只对所有显示初始化的变量进行初始化!没有显示初始化的变量不再进行 初始化!比如num1没有被显示的初始化,不再参与这个初始化过程(不知道这个理解对不对)
所以首先初始化的是:
private static Test test = new Test();
3、初始化test变量的时候调用了Test类的构造函数,在Test构造函数中对两外两个静态变量num1、num2进行了++操作,这个 时候num1和num2的初始值应该都是默认值0!
这个时候num1和num2的值都是1
4、完成了对静态变量test的初始化后开始初始化num2,这个时候num1=1,但是num2=0!!
如果把代码改为:
java 代码
- public class Test {
- public static int num1;
- public static int num2 = 0;
- private static Test test = new Test();
- private Test() {
- num1++;
- num2++;
- }
- public static Test getInstance() {
- return test;
- }
- public static void main(String[] args) {
- Test test = Test.getInstance();
- System.out.println(test.num1);
- System.out.println(test.num2);
- }
- }
结果就是1、1了!
因为按照顺序,先初始化了num2,后初始化test!
1、装载Test.class
2、给类变量分配空间,赋予初始值
test = null (指向null)
num1 = 0
num2 = 0
3、开始初始化显示赋值的变量(test、num2)
1)初始化num2,将num2赋值为0
2)初始化test
(1)对类Test进行初始化,因为类变量只初始化一次,所以这里不再需要对test进行初始化了
(2)Test没有实例变量,所以不需要初始化实例变量
(3)对Test进行构造函数初始化,对num1和num2进行++操作
(4)初始化完毕,在堆区开辟内存空间存储Test的实例。
3)这个时候num1 = 1,num2 = 1
把代码改为:
java 代码
- public class Test {
- private static Test test = new Test();
- public int num1;
- public int num2 = 0;
- private Test() {
- num1++;
- num2++;
- }
- public static Test getInstance() {
- return test;
- }
- public static void main(String[] args) {
- Test test = Test.getInstance();
- System.out.println(test.num1);
- System.out.println(test.num2);
- }
- }
结果也是1、1
1、装载Test.class
2、给类变量分配空间,赋予初始值
test = null (指向null)
num1 = 0
num2 = 0
3、开始初始化显示赋值的变量(这里是test,因为num1和num2都不是静态的)
1)初始化test
(1)按照初始化顺序,构造Test的时候首先初始化类变量,因为类变量只初始化一次,
所以这里不再需要对test进行初始化了
(2)进行定义初始化,初始化num1 和 num2
(3)对Test进行构造函数初始化,对num1和num2进行++操作
(4)初始化完毕,在堆区开辟内存空间存储Test的实例。
3)这个时候num1 = 1,num2 = 1
参考一篇不错的文章:
http://www.ibm.com/developerworks/cn/java/j-lo-clobj-init/
发表评论
-
[转]访问控制模型DAC,MAC,RBAC
2010-04-30 17:10 4978访问控制是指控制 ... -
什么是Alpha,Beta,RC,RTM版
2009-08-31 22:24 2414关于Alpha.beta,RC等版本意义 alpha就是α ... -
转载一篇老文章:构建高性能J2EE应用的十个技巧
2009-08-31 10:27 1183在最近的几次性能调优的实战中发现,往往是我们认为说的不值得说的 ... -
[转]详细介绍什么是Java虚拟机
2009-08-16 11:35 1341一、什么是Java虚拟机 当你谈到Java虚拟 ... -
关于系统调优的总结
2009-08-01 11:23 1246系统调优涉及到很多的方面,可以从以下几个方面通盘考虑。 ... -
在websphere6.1中更改事务隔离级别的步骤
2009-07-02 11:14 4167找了好久都不知道如何更改,今天终于找到了,记录一下。 参考: ... -
[转]从奥运订票系统瘫痪说起——谈FastCGI 与IT 架构
2008-12-22 15:20 19382008年,对于首都人民来说,没有什么比奥运会更大的事情了。如 ... -
[转]一种正规的性能调优方法:基于等待的调优
2008-11-12 23:46 871原文地址: http://www.info ... -
影响程序性能的主要因素
2008-11-04 00:11 4918我在公司负责产品的研 ... -
[转]如何获得WASv5.x/6.x的 Java HeapDump和JavaCore文件
2008-10-22 13:51 2326具体步骤如下: 1、 设置Windows的环境变量,使WAS ... -
关于重写equals和hashCode方法
2008-10-21 23:39 1801什么时候需要重写equals和hashCode方法? 据个 ... -
大型网站架构演变和知识体系
2008-10-09 09:48 6941原帖地址:http://www.blogjava.net/Bl ... -
Log4j输出格式控制
2008-09-23 22:21 13959参数 说明 例子 %c 列出logger名 ... -
LDAP 相关
2008-09-22 22:42 1349以前看过LDAP的相关介绍,总是感觉一头雾水,最近实际操作了一 ... -
Why Use Cases Are Not "Functions"
2008-08-04 14:28 938by Kurt Bittner General Manager ... -
程立谈架构、敏捷和SOA实践
2008-07-21 07:28 1694原文的地址: http://www.infoq.com/cn/ ... -
关于需求分析、系统设计的一个问题
2008-06-19 00:45 1421需求分析进行到什么程度就可以开始概要设计了? 概要设计做到什么 ... -
[转帖]深入浅出SQL教程之Group by和Having
2008-01-22 09:24 3224在介绍GROUP BY 和 HAVING 子句前,我们必需先讲 ... -
[转]JNDI的一篇文章
2007-12-29 11:30 11498【转贴一篇】 ------------ JNDI是 Java ... -
同步和异步
2007-12-29 11:08 22337同步在一定程度上可以看做是单线程,这个线程请求一个方法后就待这 ...
相关推荐
Java基础知识面试题目
本人通过学习java基础 然后针对这些题目进行了个人编程操练 对初学者还是有帮助的
北大青鸟S1Java基础复习题目。很简单,欢迎刚刚学习Java的童鞋们下载。
java大作业题目
java基础面试题目大全, 合适JAVA面试的程序员, 而且这些都是很多公司里经常问到的问题, 也是最基本的。
JAVA基础面试题目
java 基础 考试题目 大学 附加答案详解 A卷 corejava
java ·基础题目 刚学Java的可以做做。。。
java面试题目java面试题目java面试题目java面试题目java面试题目java面试题目
java基础面试题目,常见的几个java面试题目:说一下java类集;JDK 和 JRE 有什么区别;Spring的工作原理;框架的源码有没有看过;动态代理是怎么实现的;final 在 Java 中有什么作用; Java 中的 Math. round(-1. 5)...
JAVA课程设计题目JAVA课程设计题目JAVA课程设计题目JAVA课程设计题目JAVA课程设计题目JAVA课程设计题目
一些针对java初学者的题目代码 很基础的东东
java基础笔试题目.pdf
Java面试大全,Java题目汇总,Java基础所有题目,
java分支结构题目java分支结构题目java分支结构题目java分支结构题目java分支结构题目java分支结构题目
Java基础Java基础知识面试题目知识面试题目 Java基础知识Java基础知识面试题目面试题目Java基础知识面试题目 Java基础知识面试题目
JAVA基础笔试题目考试.pdf
重点大学本科生Java综合实验题目Java综合实验题目Java综合实验题目
java算法编程题目及答案50道
Java基础100到Java基础笔试考试题