需要帮助理解实例变量

时间:2015-01-31 19:04:04

标签: java

我的班级中有这些实例变量:

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;

在我的程序中,我使用的方法会更改xy,因此我希望heightwidth也会发生变化。但是,他们没有。有人可以解释为什么会出现这种情况,以及如何在更改xy s的方法调用后使其值“更新”?

2 个答案:

答案 0 :(得分:5)

在初始化实例变量时评估表达式private int height = y2 - y1;:即实例化类时。从那时起它就什么都不做 - 它不是"链接"以任何方式到表达式的源部分,并且在更新时不会更新。

你可能想要一个类(public的方法,如果它在类之外使用,private否则),如下所示。您可以删除heightwidth字段:

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)

您的计算仅执行一次:heightwidth字段的初始化。更改xy后,您需要重复heightwidth的计算,以更新其值。

例如:

x2 = 55;
width = x2 - x1;

执行数学计算时,变量的值仅使用一次。计算完成后,(height = y2 - y1),height变量与y2y1变量无关。


解决方案: heightwidth时重复计算,手动更新xypublic void setX1(int x1) { this.x1 = x1; height = x2 - x1; } 的值已更改。

解决方案示例:

height

或者更好的例子是不要有widthpublic int getHeight() { return y2 - y1; } public int getWidth() { return x2 - x1; } 字段,并使用它:

{{1}}