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

为何下述Java代码的area未更新?输出0而非4的原因探究

为什么你的Cube类输出area是0而不是4?

嘿,这个问题其实是Java里实例变量初始化时机的经典坑,我来给你讲明白~

先看你写的Cube类代码:

class Cube{ 
    int side; 
    int area = side * side; 
}

当你执行new Cube()创建对象的时候,Java的执行顺序是这样的:

  • 首先,给side赋予int类型的默认值0(所有未显式赋值的实例变量都会先被赋予默认值)
  • 接着执行area = side * side的初始化语句,这时候side还是0,所以area就被固定成0了——这个初始化动作只会在对象创建的那一刻执行一次

之后你给a.side = 2,只是修改了side变量的值,但area早就在对象诞生时就已经确定为0了,它不会自动跟着side的变化重新计算,所以打印出来自然是0而不是你预期的4。

怎么修复这个问题?

有两种常用的解决方案:

方案1:用getter方法动态计算area

把area改成一个通过方法动态计算的值,每次调用都用当前的side重新计算,这样就不会有同步问题:

class Cube{ 
    int side; 

    // 每次调用getArea都会用最新的side计算面积
    public int getArea() {
        return side * side;
    }
}

然后在main方法里这样调用:

public class Chronos{ 
    public static void main(String[]args) { 
        Cube a = new Cube(); 
        a.side = 2; 
        System.out.println(a.getArea()); // 这里会输出4
    } 
}

方案2:修改side时同步更新area

如果一定要保留area实例变量,可以给side添加一个setter方法,在设置side的同时更新area:

class Cube{ 
    int side; 
    int area;

    public void setSide(int newSide) {
        this.side = newSide;
        this.area = newSide * newSide; // 同步更新area
    }
}

然后main方法里改用setter设置side:

public class Chronos{ 
    public static void main(String[]args) { 
        Cube a = new Cube(); 
        a.setSide(2); 
        System.out.println(a.area); // 这里会输出4
    } 
}

总的来说,实例变量的初始化语句只会执行一次,不会自动响应其他变量的变化。如果需要根据其他变量动态变化的值,用getter方法是更简洁且不易出错的选择~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:01:19