仅有无参构造器的Java类实例是否均指向堆内存中同一个对象?
Java代码实例内存问题解答
对应代码
class Bond { private static int price = 5; public boolean sell() { if(price<10) { price++; return true; } else if(price>=10) { return false; } return false; } public static void main(String[] cash) { new Bond().sell(); new Bond().sell(); new Bond().sell(); System.out.print(price); Bond bond1=new Bond(); System.out.print(price); } }
核心结论
该类创建的所有实例并不指向堆内存中的同一个对象。
原因说明
- 只要调用
new关键字实例化类,JVM就会在堆内存中分配独立的存储空间,生成全新的类实例。上述代码一共执行了4次new Bond(),对应堆中4个完全独立的Bond对象。 - 你观察到的price变量持续累加的现象,和实例是否为同一个没有关系,根源是
price被static关键字修饰:static修饰的成员变量属于类本身,存储在JVM方法区的类元信息中,是该类所有实例共享的全局变量。任意实例修改静态变量后,所有实例读取到的都是修改后的值。
输出逻辑说明
你提到的运行输出为8 9,说明实际运行的代码在创建bond1实例后额外调用了一次sell()方法,执行逻辑如下:
- 类加载完成后静态变量price初始值为5
- 3次匿名Bond实例调用
sell(),每次price加1,执行结束后price=8,第一次打印输出8 - 新建bond1实例后调用
sell(),price加1变为9,第二次打印输出9
如果完全按照上述粘贴的代码运行,没有调用bond1.sell()的话,输出结果为88。
内容的提问来源于stack exchange,提问作者edy12
相关产品推荐
相关产品推荐

