- 浏览: 209037 次
- 性别:
- 来自: 广州
文章分类
最新评论
-
brenda:
...
技术选型(转) -
JavaScriptOMG:
写的真好,不知道如果是java.sql.date的话,怎么写呢 ...
Java得到下一天明天,明天时间 -
少女杀手:
和他的一摸一样,一个字都不差
http://anysky131 ...
弹出窗口代码大全 -
shipping:
字体好小啊,都没兴趣看下去了
测试网站性能的30款免费在线工具 -
ddd:
其实一切人活着的意义就在于他死前的心情是什么。
活着是多么美好
下面代码的结果是什么:
这道题目咋看很简单,就是考察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/
发表评论
-
技术选型(转)
2011-05-17 15:05 11722.1. 基础架构 ... -
分布式Java 应用(转)
2011-05-17 14:43 1380网络通信:协议TCP/IP,UDP/Ip,Multicas ... -
跨域访问session(转)
2011-04-22 16:14 2678大一些的网站,通常都 ... -
(转)分享一下,我常去的中文技术网站
2011-04-18 13:31 877先说一下大多数人都知 ... -
(转) request.getPathInfo() 方法的作用
2011-04-14 11:58 948request.getPathInfo(); 这个方法返回请 ... -
找到一篇性能测试的好文,简单实用,收藏之。
2011-04-10 21:59 864Java程序性能测试 1 概述 在 ... -
需要牢记的java编程规则(收藏)
2011-04-10 20:52 759(1) 类名首字母应该 ... -
一个计算机专业学生几年的编程经验汇总之二(收藏)
2011-04-10 19:48 923############################### ... -
一个计算机专业学生几年的编程经验汇总之一(收藏)
2011-04-10 18:05 920来学习Java也有两个年头了,永远不敢说多么精通,但也想谈谈自 ... -
(转)各种架构图汇总
2011-04-06 22:27 1452转载请保留出处,刘晓涛汇总!!! http://bl ... -
(转)java并发编程实践笔记
2011-04-05 22:23 8251, 保证线程安全的三种方法 : a, 不要跨线程访问共享变量 ... -
(转)构建可伸缩,高性能的互联网应用
2011-04-05 22:22 796间过得很快,来新公司已经两个月了,在这两个月的时间里,自己也感 ... -
(转)百万级访问量网站的技术准备工作
2011-04-05 22:20 928当今从纯网站技术上来说,因为开源模式的发展,现在建一个小网站已 ... -
测试数据库连接状态
2011-03-25 08:45 1432while (true) { long star ... -
(转)什么是Java里的OO思想?
2011-03-24 14:12 927OO就是面向对象 面向对象(Object Oriented,O ... -
(转)JAVA 检测网络是否为连通状态 ping
2011-03-23 14:34 2559要用java检测网络资源是否可用,我们可以采用以下两种方法: ... -
中文乱码问题的解决方法
2011-01-21 17:33 1204tomcat下中文的彻底解决[转] http://blo ... -
nginx 映射80端口
2009-08-04 09:13 3924配置一个resin, 为不用输入端 ... -
调整 Java 虚拟机
2009-07-09 23:43 1106尽管 JVM 调整操作随 JVM 提供程序的不同而有所变化,但 ... -
测试网站性能的30款免费在线工具
2009-06-28 02:12 2055你是否肯定你的网站完全兼容各大浏览器?是否知道多少秒可以打开你 ...
相关推荐
比较大小是Java基础编程题中的一道题目,它考察了程序员对基本数据类型和运算符的理解。通过比较大小,我们可以了解Java中的基本数据类型,如整数、浮点数、字符等,以及它们之间的比较关系。 2. 鸡和兔子的问题 ...
根据提供的文件信息,这里将对每一道题目进行详细的解析,并解释相关的 Java 基础知识点。 ### 1. Java 的关键字选择题 **题目:** 下列哪个是 Java 中的关键字? - A. sizeof - B. abstract - C. NULL - D. ...
这份"50道JAVA基础编程练习题"旨在帮助初学者巩固基础,掌握Java语言的核心概念,同时也适合有一定经验的开发者温故知新,提升编程技巧。 1. 变量与数据类型:练习题可能包括声明不同数据类型(如int、double、char...
本题主要考察了Java异常处理的基础知识,包括基本的异常处理结构、自定义异常的创建和使用,以及如何在实际场景中抛出和捕获异常。理解这些概念对于编写健壮的Java程序至关重要。通过解决此类问题,开发者可以更好地...
每一道题目都可能涉及不同的算法思想和技巧,例如: 1. **排序算法**:练习可能会要求你实现不同的排序方法,这将帮助你理解不同算法的时间复杂度和空间复杂度,学习如何优化代码性能。 2. **查找算法**:通过查找...
1. **基础语法**:Java的基础语法是解答任何Java题目的基石,包括变量声明、数据类型、运算符、流程控制(如if-else、for、while循环)和函数的使用。 2. **面向对象编程**:作为面向对象的语言,Java的类、对象、...
这个文档可能包含了每一道题目的描述、输入输出格式、可能的测试用例以及预期的解决方案。通过阅读和分析这些题目,开发者可以逐步解析问题,设计合适的算法,然后编写JAVA代码来实现。文档可能还提供了关于如何提交...
在《Java编程基础》课程中,学习者会接触到一系列的核心...每一道题目都是对理论知识的实践检验,通过调试和解决问题,有助于形成良好的编程习惯和问题解决技巧。对于初学者来说,这份习题答案是一份宝贵的参考资料。
以上是JAVA算法训练题目中的关键知识点,每一道题目都涵盖了不同的算法思想和编程技巧,通过解决这些问题,我们可以提高逻辑思维能力和代码实现能力。在实际编程过程中,还应注重代码的可读性和效率,合理运用数据...
1. **Java基础**:面试通常会从Java的基础语法开始,如封装、继承、多态等面向对象特性,以及异常处理、集合框架(List、Set、Map)、IO流、NIO、反射、注解等。对于这些基础知识,理解其原理并能熟练运用是必备的。...
1. **Java基础** - **数据类型**: 包括原始数据类型(如整型、浮点型、字符型和布尔型)以及引用数据类型(类、接口和数组)。 - **变量**: 学习如何声明、初始化和使用不同类型的变量。 - **运算符**: 熟悉算术...
在Java编程领域,"百马百担问题"是一道经典的逻辑与算法题目,它源于中国古代的智力谜题,旨在考察程序员...通过解决此类问题,我们可以提升对Java基础语法、逻辑控制以及算法设计的理解,同时也能锻炼我们的编程思维。
- **解析**: 这是一道关于Java中的三元运算符题目。在Java中,三元运算符 `?:` 的语法结构为 `条件 ? 值1 : 值2`,即如果条件为真,则返回值1;否则返回值2。在这个例子中,`x > y` 为假,因此表达式返回 `x` 的值,...
这里的"剑指offer编程题66道题目描述及java代码实现汇总"是一个集合,包含了书中66个编程挑战的详细描述以及对应的Java代码实现。以下是对这些编程题目的部分解析和相关知识点的详细阐述: 1. **数组中出现次数超过...
Java作为一门广泛使用的编程语言,对于初学者来说,掌握其基础知识是至关重要的。这份"Java零基础配套练习题51道完整版...在解答每一道题目时,都应深入思考其背后的原理,这样才能真正巩固和拓展自己的Java知识体系。
通过系统地整理和解析每一道题目,这份资料旨在帮助用户掌握Java的基本概念、语法和编程技巧,提高编程能力,并为面试和开发工作打下坚实的基础。 ### 资源概述 #### 内容结构 1. **Java基础语法** - **数据类型...
在本题目中,我们面临的是一个名为"employeeJAVA作业"的编程练习,主要涉及Java语言。根据描述,这个作业是关于“应聘者”的,暗示我们需要编写一个与员工或应聘者管理相关的程序。在这个作业中,可能需要实现一些...
Java面试宝典2011版-1C,Java基础部分.doc 三大框架面试题.zip 技术面试题.zip Android笔试题库 C语言终极面试宝典.doc Java笔试题目汇总.pdf Java面试宝典_2010.doc 面试全攻略100题.doc 智力题和答案.doc C语言面试...
在本课程中,我们将深入探讨基于Java实现的多种算法题目,这些题目涵盖了基础算法到较为复杂的逻辑思维。每个题目都旨在提升我们对编程语言的理解,同时增强我们的算法设计和问题解决能力。以下是对每个题目的详细...