Java - 在没有方法的情况下编辑实例变量

时间:2015-01-06 23:58:12

标签: java variables object instance

我是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变量。

所以我的问题是:有没有办法在不调用方法的情况下正确设置变量?这似乎是非常不必要的,因为我甚至没有将参数传递给它。

抱歉我的英语不好,我希望你明白我想说的话。

3 个答案:

答案 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.

如果您需要将xMeteryMeter初始化为基于xy的值,只需将其声明为与其他字段一样:

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