我这里有一个代码,正在尝试使用:
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方法中,我需要一个multiply方法,用有理数的分子乘以r的分子,用这个有理数的分母乘以r的分母。下列哪一项可以用来替换/缺少的代码/以便multiply()。
我把范围缩小到:
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条答案
按热度按时间thigvfpy1#
简而言之:这三个变量都应该可以工作,与上一个变量只有一个区别:您的类不是final,它允许子类更改getnum和getden的行为。
另外,创建表示可变数字的类也很少见。也许换个签名比较好
multiply
成为返回一个新的
RationalNumber
用乘法的结果而不是改变当前乘法的内部状态。在这种情况下,执行将是(或您提供的任何其他变体)
sz81bmfz2#
这三种方法是正确的,因为:
第1行:将num(示例变量)*r.num(r的示例变量)结果赋给num.even
num
或者den
有了私有访问权,当您在自己内部处理同一个类时,就可以访问私有成员。第2行:将den(示例变量)*r.den(r的示例变量)结果赋给den。
在这段代码中,您使用
this
关键字来明确说明num和den是类的示例变量。在这种情况下,这是没有必要的,因为您没有阴影(当局部变量阴影示例变量的名称时)。逻辑同上。您只是使用访问器方法(get)来获取私有字段的值。逻辑是一样的。因为,正如我已经说过的,当前对象可以访问同一类对象的私有成员,所以这是不必要的。
在这种情况下,我会使用第一种方法;)
shstlldc3#
我认为最后一个将按预期工作:
s71maibg4#
实际上,有相反的观点:使用
this
对于类的变量,请始终确定此变量属于谁。或者另一个:如果局部变量和类变量之间存在冲突,请使用一个。在我的工作中,我使用第二个:douse
this
除非我必须这么做。代码中的字数越少,问题就越少。所以在你的例子中,你可以使用任何变体。
rbpvctlc5#
它们在功能上都是等价的。
你需要
this
仅当您需要确保引用的是示例变量,而不是局部变量或参数时。如果构造函数的参数num
以及den
,你需要写指定要分配参数
num
到示例变量num
.然而,由于这些方法没有歧义,它们都将起作用。您还可以访问变量
r.num
以及r.den
直接地,因为即使它们是私有的,它们仍然可以被同一个类访问,而不仅仅是同一个示例。我会把它写成
vyswwuz26#
试试这个,我认为它是最正确的:
r6l8ljro7#
按照洛萨的回答,如果
multiply
方法将返回一个全新的有理数距离。我甚至会使这个方法对类是静态的,因为它只是
RationalNumber
s、 而不是与修改它的类的单个示例交互的东西。这样,你可以这样称呼它:
方法定义将是: