据说一半以上的java程序员会出错的题
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了据说一半以上的java程序员会出错的题,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1865字,纯文字阅读大概需要3分钟。
内容图文
![据说一半以上的java程序员会出错的题](/upload/InfoBanner/zyjiaocheng/1124/7b0c8ac278f9447ab143fee535169544.jpg)
大三即将结束,经过一段时间的较为系统的自学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);
- }
- } ?
原文来自techfox技术论坛java社区 http://techfoxbbs.com/blog-1-3.html
原文:http://www.cnblogs.com/techfox/p/4563501.html
内容总结
以上是互联网集市为您收集整理的据说一半以上的java程序员会出错的题全部内容,希望文章能够帮你解决据说一半以上的java程序员会出错的题所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。