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
,这是之前已经确定的。
因为
int area=side*side
初始化多维数据集对象时发生,因此设置为0 * 0 = 0;
要改变这一点,你必须制作一个方法,即setSide或getArea,并在那里进行计算。即(根本不需要使用区域变量)
public int getArea(){
return side*side;
}
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());
}
}
这是您获得最新价值的方式。
创建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
}
在创建对象时,它将采用默认值。您正在为不会刷新的变量赋值。因此,最好维护setter和getter,然后相应地执行操作
对于如何初始化类的基本理解,这更是一个问题。
当实例化类时,或者换句话说当你执行area = side * side
时,将执行Cube a = new Cube();
语句。
在那之后,area
永远不会被修改。这就是为什么你永远不应该将类成员变量初始化为非常量值,因为你很容易忘记它是什么。
您应该创建一个新方法来计算区域,例如:
class Cube{
int side;
public int getArea(){
return side * side;
}
}