我的班级中有这些实例变量:
private int x1 = 0;
private int y1 = 0;
private int x2 = 0;
private int y2 = 0;
private int height = y2 - y1;
private int width = x2 - x1;
在我的程序中,我使用的方法会更改x
和y
,因此我希望height
和width
也会发生变化。但是,他们没有。有人可以解释为什么会出现这种情况,以及如何在更改x
和y
s的方法调用后使其值“更新”?
答案 0 :(得分:5)
在初始化实例变量时评估表达式private int height = y2 - y1;
:即实例化类时。从那时起它就什么都不做 - 它不是"链接"以任何方式到表达式的源部分,并且在更新时不会更新。
你可能想要一个类(public
的方法,如果它在类之外使用,private
否则),如下所示。您可以删除height
和width
字段:
public int getHeight() { return this.y2 - this.y1; }
但是,如果您决定在内部仍然需要宽度和高度,我会将其更改为名为private
的{{1}}方法。名为calculateHeight
的方法通常是字段的访问器而不是变异方法。然后,只要更改getXYZ
的字段值,就可以调用此值(或等效的calculateWidth()
)。
y2, y1, x2, x1
顺便说一句,无论public int getHeight() { return this.height; }
private int calculateHeight() { return this.y2 - this.y1; }
...
this.y2 = this.y2 + 10;
this.height = calculateHeight();
多于或少于y2
,我都认为宽度和高度都是正数。您可以使用Math.abs
删除减法结果上的符号:
y1
我的偏好是使用单一方法将高度和宽度作为维度返回。这两个值实际上是某个时间点的单个数据。您可以使用java.awt.Dimension:
public int getHeight() { return Math.abs(y2 - y1); }
答案 1 :(得分:1)
您的计算仅执行一次:height
和width
字段的初始化。更改x
和y
后,您需要重复height
和width
的计算,以更新其值。
例如:
x2 = 55;
width = x2 - x1;
执行数学计算时,变量的值仅使用一次。计算完成后,(height = y2 - y1
),height
变量与y2
和y1
变量无关。
解决方案: 在height
和width
时重复计算,手动更新x
和y
值public void setX1(int x1) {
this.x1 = x1;
height = x2 - x1;
}
的值已更改。
解决方案示例:
height
或者更好的例子是不要有width
和public int getHeight() {
return y2 - y1;
}
public int getWidth() {
return x2 - x1;
}
字段,并使用它:
{{1}}