我在这里有这个代码,我正在尝试使用:
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();
有人可以告诉我这些(或多个)中的哪一个会使方法按预期工作吗?
答案 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。即使num
或den
拥有私人访问权限,当您在其内部处理同一个类时,您也可以访问私有成员。
第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
。如果您的构造函数具有名为num
和den
的参数,则需要编写
this.num = num;
this.den = den;
指定您要将参数num
分配给实例变量num
。
然而,由于方法中没有歧义,它们都会起作用。您还可以直接访问变量r.num
和r.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());
}