为何下述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
相关产品推荐
相关产品推荐

