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

时间:2018-01-03 12:25:27

标签: java

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=4a.area。 我的思维过程是,它会看到打印Cube的命令,请与a.side一起检查,看看它应该是先前已经确定的 this.label6.AutoSize = true; this.label6.Location = new System.Drawing.Point(59, 174); this.label6.Name = "label6"; this.label6.Size = new System.Drawing.Size(72, 13); this.label6.TabIndex = 16; this.label6.Text = "Output String:"; 乘以它自己

5 个答案:

答案 0 :(得分:5)

因为

int area=side*side 
初始化多维数据集对象时会发生

,因此将其设置为0 * 0 = 0;

要更改此设置,您必须创建一个方法,即setSide或getArea,并在那里进行计算。即(根本不需要使用区域变量)

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

答案 1 :(得分: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());
    }
}

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

答案 2 :(得分: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属性并按需计算它。

那是什么安慰者和吸气者:

修改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
}

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

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

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

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

class Cube{
    int side;

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