我应该何时在方法中使用它?

时间:2017-09-04 20:09:56

标签: java class object methods this

我在这里有这个代码,我正在尝试使用:

public class RationalNumber() {
    private int num;
    private int den;

    public RationalNumber(int n, int d) {
        num = n;
        den = d;
    }

    public void multiply(RationalNumber r) {
        /* missing code */
    }

    public int getNum() {
        return num;
    }

    public int getDen() {
        return den;
    }
}

在public void multiply方法中,我需要使用方法乘以将RationalNumber的分子乘以r的分子,并将此RationalNumber的分母乘以r的分母。以下哪一项可用于替换/ *缺少代码* /以便乘以()。

我把它缩小到:

num = num * r.num;
den = den * r.den;

this.num = this.num * r.num;
this.den = this.den * r.den;

num = num * r.getNum();
den = den * r.getDen();

有人可以告诉我这些(或多个)中的哪一个会使方法按预期工作吗?

7 个答案:

答案 0 :(得分:5)

简而言之:这三个都应该有效,最后一个变体只有一个区别:你的类不是final,它允许子类改变getNum和getDen的行为。

同样,创建表示Number的类是可变的并不常见。也许最好将multiply的签名更改为

public RationalNumber multiply(RationalNumber)

返回带有乘法结果的新RationalNumber,而不是更改当前状态的内部状态。在这种情况下,实施将是

return new RationalNumber(num * r.num, den * r.num);

(或您提供的任何其他变体)

答案 1 :(得分:2)

这三种方式是正确的,因为:

1. num = num * r.num;
2. den = den * r.den;

第1行:将num(实例变量)* r.num(r的实例变量)结果赋给num。即使numden拥有私人访问权限,当您在其内部处理同一个类时,您也可以访问私有成员。

第2行:将den(实例变量)* r.den(r的实例变量)结果赋予den。

this.num = this.num * r.num;
this.den = this.den * r.den;

在此代码中,您使用this关键字来明确地说num和den是类的实例变量。在这种情况下,没有必要,因为您没有阴影(当局部变量遮蔽实例变量的名称时)。逻辑如上所述。

num = num * r.getNum();
den = den * r.getDen();

您只是使用访问器方法(get)来获取私有字段的值。逻辑继续相同。因为,正如我已经说过的,当前对象可以访问同一类对象的私有成员,因此它是不必要的。

在这种情况下我会使用第一种方式;)

答案 2 :(得分:2)

所有这些功能都相同。

只有在需要确保引用实例变量而不是局部变量或参数时才需要this。如果您的构造函数具有名为numden的参数,则需要编写

this.num = num;
this.den = den;

指定您要将参数num分配给实例变量num

然而,由于方法中没有歧义,它们都会起作用。您还可以直接访问变量r.numr.den,因为即使它们是私有的,它们仍然可以访问相同的,而不仅仅是同样的例子。

我会把它写成

num *= r.num;
den *= r.den;

答案 3 :(得分:1)

我认为最后一个会按预期工作:

num = num * r.getNum();
den = den * r.getDen();

答案 4 :(得分:1)

实际上,有相反的观点:始终使用this用于类'变量,以确定此变量属于谁。或者另一个:如果本地变量和类变量之间存在冲突,请使用一个。

在我的工作中,我使用第二个:只有在必要时才使用this。尽可能减少代码中的单词 - 减少问题。

因此,在您的示例中,您可以使用任何变体。

答案 5 :(得分:0)

尝试这个,我认为这是正确的最正确的:

this.num = this.num * r.getNum();
this.den = this.den * r.getDen();

答案 6 :(得分:0)

按照Lothar的回答,如果multiply方法会返回一个全新的RationalNumber,那会更好。

我甚至会将该方法设置为类的静态,因为它只是RationalNumber之间的常见操作,而不是与修改它的类的单个属性交互的东西。

通过这种方式,您可以这样称呼它:

RationalNumber mul = RationalNumber.multiply(rn1,rn2);

方法定义将是:

public static RationalNumber multiply(RationalNumber rn1, RationalNumber rn2){
    return new RationalNumber(rn1.getNum() * rn2.getNum(), rn1.getDen() * rn2.getDen());
}