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);

}

}  ​

原文来自techfox技术论坛java社区 http://techfoxbbs.com/blog-1-3.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值