大三即将结束,经过一段时间的较为系统的自学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

java二级选择题要对一半吗_据说一半以上的java程序员会出错的题相关推荐

  1. php算法求出一个数可以被分解成多少个_程序员的算法趣题

    计算机的世界每天都在发生着深刻的变化.新操作系统的发布.CPU性能的提升.智能手机和平板电脑的流行.存储介质的变化.云的普及--这样的变化数不胜数. 在这样日新月异的时代中,"算法" ...

  2. 程序员的算法趣题:Q13 有多少种满足字母算式的解法(Java版)

    题目说明 所谓字母算式,就是用字母表示的算式, 规则是相同字母对应相同数字,不同字母对应不同数字, 并且第一位字母的对应数字不能是 0. 譬如给定算式 We * love = CodeIQ,则可以对应 ...

  3. java二级考试试题题型有哪些_哪里有计算机二级题库?计算机二级考试题型有哪些?...

    哪里有计算机二级题库?计算机二级考试题型有哪些? 2019-10-1815:15:29 来源: 作者:songzini 1 //哪里有计算机二级题库?计算机二级考试题型有哪些? 计算机二级作为当代大学 ...

  4. java代码在jsp中怎么写_在jsp中写java代码

    该服务器上的所有的访问者的所有 jsp 页面 D.该服务器上的所有的访问者的所有 jsp 页面和 Java 程序 6.在 JSP 中调用 JavaBean 时不会用到的标记是( )...... jav ...

  5. java吃货联盟系统源码_吃货联盟 源代码 Java初级小项目

    咳咳,今天博主给大家写一个小的项目:吃货联盟订餐系统.博主不是大神(互联网架构师的路上ing),也是小白一个,不过是刚入门的小白^_^.项目功能也很简单:只是模拟日常的订餐流程呦,所以有错误以及功能不 ...

  6. 对java编程的搞笑形容_史上最搞笑的程序员期末考试题,笑得我要喷饭了!

    2019年度全国程序员期末考试统一用卷 一.选择题 1.现在公认的世界上第一个女程序员是? A. Taylor swift B. Ada Lovelace C. Angela Go D. Alan M ...

  7. java如何创造一个整数的类_【技术干货】Java 面试宝典:Java 基础部分(1)

    原标题:[技术干货]Java 面试宝典:Java 基础部分(1) Java基础部分: 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语法,集合的语法,io 的 ...

  8. java工程师的一生_百看不厌之一张图诠释程序员的一生

    原标题:百看不厌之一张图诠释程序员的一生 01 百看不厌系列之一张图诠释程序员的一生. 02 变得越来越强了... 03 不知道是干什么的,但又不敢删... 04 当前端的人抱怨Java 时,C++程 ...

  9. java里面如何加入高级的东西_如何成为一名Java高级架构师

    近些年来互联网快速发展,现阶段的数据量和高并发的诉求,引起了不少传统的技术人员的力不从心,企业愈发关注到了系统架构的重要性,既需要掌控整体又需要洞悉局部瓶颈并依据具体的业务场景给出解决方案的领导型人物 ...

最新文章

  1. QGIS打印布局cheatsheet
  2. Java实现算法导论中快速傅里叶变换FFT递归算法
  3. 电脑计算机无法找到脚本文件夹,win10系统开机出现无法找到脚本文件的设置办法...
  4. 记一些茅塞顿开的事情
  5. ubuntu11.10 samba服务器配置
  6. Android 上滑背景变淡,在Android中,如何平滑地将背景从一种颜色淡化到另一种颜色? (如何使用线程)...
  7. 华为云内容审核—性能更加狂野,价格更加腼腆
  8. Java导出源程序_JAVA导出项目的所有源代码到一个文件
  9. 数据结构关键路径_2021年厦门大学考研丨能源学院845数据结构参考书目推荐
  10. vue-cli3以上框架解决跨域问题
  11. peoplesoft 调用Java_利用 XML Publisher 创建 PeopleSoft 报表
  12. 安工大计算机学院李雪,计算机学院本科生党支部召开党员大会
  13. Java日期:今天,昨天,某一天,某一天的前一天
  14. 宏定义语句的 GPBCON 、GPBDAT、GPBUP 地址(老师布置的作业,没接触过,不懂,求大神解答,万分感谢)
  15. java 三个点号...的含义-可变参数
  16. Linux下线程池源码实现
  17. 羊车门问题的python代码_作业:羊车门问题
  18. 后羿采集器怎么导出数据_怎么安装后羿采集器?后羿网页数据采集器安装教程...
  19. 众昂矿业:萤石的简介及其应用
  20. 正则,把字符串/替换成-

热门文章

  1. 北京大学现代农业研究院张华伟实验室招聘启示
  2. JGG | 肠道细菌加重小分子量卡拉胶诱发的直肠炎症
  3. SCLS:巴斯德所崔杰组揭示海洋无脊椎动物RNA病毒的遗传多样
  4. 热点:3个故事概览突飞猛进的肠道病毒组研究
  5. 期刊介绍 | SEL:力争成为土壤生态学界的“Cell”
  6. R语言:生成正态分布数据生成--rnorm,dnorm,pnorm,qnorm
  7. 2020滑铁卢大学计算机科学学费,加拿大大学国际生学费上涨 滑铁卢大学学费上涨62%...
  8. R语言sqrt函数为数值开平方根实战
  9. pandas使用dropna函数删除dataframe中列非缺失值的个数小于某一比例阈值的数据列
  10. R语言回归模型构建、回归模型基本假设(正态性、线性、独立性、方差齐性)、回归模型诊断、car包诊断回归模型、特殊观察样本分析、数据变换、模型比较、特征筛选、交叉验证、预测变量相对重要度