我是Java的新手,我一直在寻找改进代码的方法。但是,如果有可能的话,我似乎无法得到这个。
我们说我有这个代码(我编辑了不相关的部分,因此代码可能看起来很奇怪):
public class NewBody {
public static int distanceScale = 5;
public int x, y;
public float xMeter = x * distanceScale;
public float yMeter = y * distanceScale;
public NewBody(int x, int y){
this.x = x;
this.y = y;
}
public void pixToMeter(){
this.xMeter = distanceScale * this.x;
}
如果我不调用pixToMeter()并尝试使用" instance.xMeter"直接,它只返回值0,即使我已经在构造函数中设置了x变量。
所以我的问题是:有没有办法在不调用方法的情况下正确设置变量?这似乎是非常不必要的,因为我甚至没有将参数传递给它。
抱歉我的英语不好,我希望你明白我想说的话。
答案 0 :(得分:4)
当x仍然为零时,xMeter的初始化完成。
这是实际发生的事情:
public NewBody(int x, int y) {
// All fields are zeroed: 0, null, 0.0.
super(); // Object constructor, as Object is the parent class.
// Those fields that are initialized:
xMeter = this.x * distanceScale; // 0.0f * 5
yMeter = this.y * distanceScale;
// The rest of the constructor:
this.x = x;
this.y = y;
}
对于依赖值:
public final void setX(int x) {
this.x = x;
xMeter = this.x * distanceScale;
}
并应用DRY原则(不要重复自己):可以放弃xMeter的初始化并在构造函数中调用setX(x)。
在构造函数中调用时,最后使setX
为final,即:不可覆盖。
答案 1 :(得分:2)
问题的根源在于:
public float xMeter = x * distanceScale;
问题是您正在初始化此实例变量在构造函数之外。因此,由于x
初始化为0,因此乘法的结果也为0.
如果您需要将xMeter
和yMeter
初始化为基于x
或y
的值,只需将其声明为与其他字段一样:
public int xMeter;
并在构造函数中初始化它们的值:
public newBody(int x, int y){
// initialize x and y ...
this.xMeter = x * distanceScale;
答案 2 :(得分:1)
正如其他人所提到的,当初始化xMeter
时,构造函数尚未被调用且x
仍为0
,因此xMeter
的值为{{ 1}}。
要更改它,您必须在构造函数中初始化0
后更新xMeter
的值,如下所示:
x
但是,您提到了每次public NewBody(int x, int y){
this.x = x;
this.y = y;
// update x and y meter
xMeter = x * distanceScale;
yMeter = y * distanceScale;
}
更改时您希望xMeter
更新的方式。因为它与您当前的代码一致,所以不会发生这种情况。但是,我的建议是创建方法以更改x
(以及x
)的值,并在这些方法中,还更新{的值{1}}和y
。这样,只要您想要更改xMeter
,请调用方法,它也会更新您的其他值。
尝试添加这些方法并将构造函数更改为:
yMeter