`
hm4123660
  • 浏览: 282885 次
  • 性别: Icon_minigender_1
  • 来自: 广州
博客专栏
Dea4ce76-f328-3ab2-b24a-fb268e1eeb75
数据结构
浏览量:70118
社区版块
存档分类
最新评论

据说一半以上的java程序员会出错的题

    博客分类:
  • Java
阅读更多

         大三即将结束,经过一段时间的较为系统的自学java, 突然看到一个自称一半以上的java程序员都会出错的程序尤为感兴趣。便深究了一番

     程序代码如下:

package com.longpo;

class Person {
	private static Person person = new Person();

	public static int count1;

	public static int count2 = 5;

	private Person() {
		count1++;
		count2++;
	}
	
	public static Person getInstance()
	{
		return person;
	}
	
}

public class Testsingleton {
	public static void main(String[] args) {

		Person person=Person.getInstance();
		
		//可以用直接Person.count1
		System.out.println("count1: "+person.count1);
	
		System.out.println("count2: "+person.count2);
	}

}

 

上面代码输出的结果是什么呢?

很容易让人觉得会输出1和6(从题目可知肯定不是这么简单),那时我猜答案应该是1和5,但说不出所以然。我把代码赋值到Eclipse下运行。得到

 



 

 

    和我猜的一样,可是我完全不知道其原因。。于是就开始了谷歌求知之路,经过研究,ClassLoader渐渐映入我的眼帘。下面我来说说我认为的原因,有错误还望指导更正。(这里这介绍结果的由来,详细的类加载分析和自定义类加载器在下一篇博客更新)

 

类在执行之前会执行三个步骤:

1.类的加载:查找并加载类的二进制数据,把对应的class文件加载到内存

2.连接

     2.1. 验证:确保被加载的类的正确性(主要防止恶心的class文件被加载)

     2.2. 准备:为类的静态变量分配内存,并将其初始化为默认值

     2.3. 解析:把类中的符合引用转换为直接引用

3.初始化:为类的静态变量赋予正确的初始值

 

发现其中步骤2.2和3提到了关键字静态变量,重点关注这两步,2.2的结果会导致为静态变量

person,count1,count2分配内存并赋值(默认值)

person=null;

count1=count2=0

 

到步骤3,初始化时会为静态变量赋予正确的值,那么什么时候才会进行初始化呢?接着

谷歌百度,得到:

     所有的java虚拟机实现必须在每一个类或接口被java程序“首次主动使用”时才初始化

 

java对类的使用方式分为:主动使用,被动使用

主动使用有六种:(除这6种外,其他都是被动使用)

1。创建类的实例

2。访问某个类或接口的静态变量或对该静态变量赋值

3。调用类的静态方法

4。反射

5。初始化类的子类

6。java虚拟机启动时被标注位启动类的类

 

懂了第三步(初始化),那么就可以来解释程序为什么输出1和5了,我画了一个图

 



 

现在应该明白了其中的原因了吧,为了检验是否真的明白,可以把代码再改为

 

package com.longpo;

class Person {
	

	public static int count1;
	

	public static int count2 = 5;
	
	private static Person person = new Person();
	
	private Person() {
		count1++;
		count2++;
	}
	
	public static Person getInstance()
	{
		return person;
	}
	
}

public class Testsingleton {
	public static void main(String[] args) {

		Person person=Person.getInstance();
		
		//可以用直接Person.count1
		System.out.println("count1: "+person.count1);
	
		System.out.println("count2: "+person.count2);
	}

}

 

其输出的结果又是什么呢?

 



 

 

 

  • 大小: 5.9 KB
  • 大小: 4.7 KB
  • 大小: 24.5 KB
  • 大小: 5.3 KB
12
6
分享到:
评论
8 楼 User_Java 2015-06-09  
类的静态变量初始化顺序与其声明的顺序有关。自增操作都执行后保存了结果。只是前者先初始为null, 0,0. 自增后变为null,1,1.最后整形变量5把1覆盖了。后者你调整了Person对象的声明位置。自增操作在整形变量赋值之后,所以结果 变成了1,6. 结论:类的静态变量初始化顺序与其声明的顺序有关
7 楼 flashsnow 2015-06-05  
在公司写这样的代码是要遭雷劈的
But,为了理解ClassLoad,还是不错的例子
6 楼 hm4123660 2015-06-05  
求求你帮帮我 写道
为什么初始化count1没有赋予初始值,却把count2的初始值给赋予了呢?

程序本身并没有对count1赋值
5 楼 求求你帮帮我 2015-06-05  
为什么初始化count1没有赋予初始值,却把count2的初始值给赋予了呢?
4 楼 小刘不牛 2015-06-05  
第二段代码改在哪呢
3 楼 天堂伞 2015-06-05  
我也做错了,又复习了一次初始化知识,理解了就很容易了。大三就有这钻研能力,确实不容易
2 楼 fggsgigomkg 2015-06-05  
1 楼 liuwenjie517333 2015-06-04  
您的专研精神值得所有技术人员学习,大三就有这种精神,很难能可贵!加油

相关推荐

    Java程序员面试笔试真题与解析.tar

    Java程序员面试笔试真题与解析,包含各大IT企业面试笔试的题目

    java程序员早期面试题汇总.zip

    java程序员早期面试题汇总 BAT经典面试题汇总.pdf Java常考面试题.pdf java面试题(题库全).doc java面试题-外企软件工程师面试题大全.rar 程序员面试题精选100题.pdf ... --------------------------------...

    Java程序员面试笔试真题与解析

    Java程序员面试笔试真题与解析,高清,绝对高清制作的

    Java程序员就业面试题大全

    Java程序员就业面试题大全Java程序员就业面试题大全Java程序员就业面试题大全Java程序员就业面试题大全Java程序员就业面试题大全Java程序员就业面试题大全

    java程序员笔试题java程序员笔试题

    Java 程序员笔试题 本资源提供了 Java 程序员笔试题,共 10 道单项选择题和 2 道多项选择题,涵盖了 Java 基础知识、编程技术、数据类型、运算符、控制流程、方法和类等方面的知识点。 1. Java 程序编译后会产生 ...

    《Java程序员面试笔试真题与解析》.pdf

    《Java程序员面试笔试真题与解析》

    Java程序员笔试题汇编

    应聘Java程序员参考资料。共149题,含参考答案。主要包括以下几方面的试题:Java基础、多线程、JSP、Servlet、JDBC、XML、EJB、服务器、MVC、JavaEE、设计模式、Linux、代码改错等。

    Java程序员面试资料及简历模版

    Java程序员面试资料及简历模版 Java程序员面试资料及简历模版 Java程序员面试资料及简历模版 Java程序员面试资料及简历模版 Java程序员面试资料及简历模版 Java程序员面试资料及简历模版 Java程序员面试资料及简历...

    2018年java-程序员面试宝典+题库

    2018java程序员面试宝典+题库,很全。压缩的文档,打开是PDF版

    java程序员面试题

    java程序员面试题java程序员面试题java程序员面试题java程序员面试题java程序员面试题

    java中级程序员面试题 java程序员面试题 java工程师面试题

    java中级程序员面试题 java程序员面试题 java工程师面试题

    JAVA程序员笔试面试题汇总及答案 .chm

    JAVA程序员笔试面试题汇总及答案.chm chm格式。

    Java程序员面试宝典

    《Java程序员面试宝典》附带1张DVD光盘,内容为《Java程序员面试宝典》所有面试题的多媒体教学视频(共14.5小时)及免费赠送的55小时Java教学视频和5.5小时算法教学视频。授人以鱼,不如授人以渔。《Java程序员面试...

    java初级程序员试题

    Java初级程序员试题主要涵盖Java语言的基础知识,包括但不限于语法、数据类型、控制结构、类与对象、异常处理、集合框架等方面。以下是对这些知识点的详细解释: 1. **Java语法**:Java是一种强类型、面向对象的...

    JAVA程序员常用面试题

    集合了JAVA程序员面试常会问到的题目 Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)interface(接口)  答:匿名的内部类是没有名字的内部类。可以继承抽象(SDK1.5...

    java程序员经典面试题

    Java 程序员经典面试题 本资源为Java程序员面试必备资料,涵盖了Java基础、线程编程、JSP、Servlet、JDBC、JDO、EJB、应用服务器、J2EE、MVC、设计模式等多个方面的知识点,旨在帮助Java程序员更好地准备面试,获得...

    java程序员面试交流项目经验

    java程序员面试交流项目经验java程序员面试交流项目经验java程序员面试交流项目经验java程序员面试交流项目经验java程序员面试交流项目经验java程序员面试交流项目经验java程序员面试交流项目经验java程序员面试交流...

Global site tag (gtag.js) - Google Analytics