为什么以下代码不为变量创建新值?

问题描述 投票:2回答:5
class Cube{
    int side;
    int area = side * side;
}

public class Chronos{
    public static void main(String[]args) {
        Cube a = new Cube();
        a.side = 2;
        System.out.println(a.area);
    }
}

我的问题是为什么输出“0”而不是将给定的变量a.side=2乘以它并给出a.area=4。我的思维过程是它会看到打印a.area的命令,请用Cube回来查看它应该会增加a.side,这是之前已经确定的。

java
5个回答
5
投票

因为

int area=side*side 

初始化多维数据集对象时发生,因此设置为0 * 0 = 0;

要改变这一点,你必须制作一个方法,即setSide或getArea,并在那里进行计算。即(根本不需要使用区域变量)

public int getArea(){
   return side*side;
}

1
投票
Cube a=new Cube();

执行此操作时,变量将使用默认值进行初始化。后来你只是设置变量size。这并不意味着整个班级都会疯狂地刷新。

初始化两个变量时使用默认值(0)进行初始化。因此你看到了0。

你也需要设置区域。或者理想情况下,写一个给出区域的方法。那里你可以return size*size

class Cube{
    int side;
    public int getArea(){
      return side * side;
    }
}

然后在主要

public class Chronos{
    public static void main(String[]args) {
        Cube a = new Cube();
        a.side = 2;
        System.out.println(a.getArea());
    }
}

这是您获得最新价值的方式。


0
投票

创建Cube实例时,首先初始化实例变量,然后执行构造函数体。

int side;

被赋予默认值0

int area=side*side;

被赋值0,因为0 * 0是0

仅在稍后,在Cube实例初始化之后,你的a.side=2语句将a.side设置为2,但这不会影响已经计算的a.area,它不会被重新计算。

如果在创建实例后允许修改side属性,则必须在更新area时修改side。或者你可以消除area属性并按需计算。

这就是setter和getter的用途:

修改area时修改side

public void setSide (int side) {
    this.side = side;
    this.area = side * side;
}

或删除area属性,而是使用:

public int computeArea () {
    return side * side;
}

你对应的main将是:

public static void main(String[]args) {
    Cube a = new Cube();
    a.setSide(2);
    System.out.println(a.getArea()); // if setSide also modifies the area property
}

要么

public static void main(String[]args) {
    Cube a = new Cube();
    a.setSide(2);
    System.out.println(a.computeArea()); // if you remove the area property
}

0
投票

在创建对象时,它将采用默认值。您正在为不会刷新的变量赋值。因此,最好维护setter和getter,然后相应地执行操作


0
投票

对于如何初始化类的基本理解,这更是一个问题。

当实例化类时,或者换句话说当你执行area = side * side时,将执行Cube a = new Cube();语句。

在那之后,area永远不会被修改。这就是为什么你永远不应该将类成员变量初始化为非常量值,因为你很容易忘记它是什么。

您应该创建一个新方法来计算区域,例如:

class Cube{
    int side;

    public int getArea(){
        return side * side;
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.