You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

仅有无参构造器的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()方法,执行逻辑如下:

  1. 类加载完成后静态变量price初始值为5
  2. 3次匿名Bond实例调用sell(),每次price加1,执行结束后price=8,第一次打印输出8
  3. 新建bond1实例后调用sell(),price加1变为9,第二次打印输出9

如果完全按照上述粘贴的代码运行,没有调用bond1.sell()的话,输出结果为88。

内容的提问来源于stack exchange,提问作者edy12

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.17 07:36:09