我应该在什么时候在方法中使用它?

zy1mlcev  于 2021-07-03  发布在  Java
关注(0)|答案(7)|浏览(467)

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

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();

有人能告诉我这些方法中的哪一个(或不止一个)能使方法按预期工作吗?

thigvfpy

thigvfpy1#

简而言之:这三个变量都应该可以工作,与上一个变量只有一个区别:您的类不是final,它允许子类更改getnum和getden的行为。
另外,创建表示可变数字的类也很少见。也许换个签名比较好 multiply 成为

public RationalNumber multiply(RationalNumber)

返回一个新的 RationalNumber 用乘法的结果而不是改变当前乘法的内部状态。在这种情况下,执行将是

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

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

sz81bmfz

sz81bmfz2#

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

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

第1行:将num(示例变量)*r.num(r的示例变量)结果赋给num.even 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)来获取私有字段的值。逻辑是一样的。因为,正如我已经说过的,当前对象可以访问同一类对象的私有成员,所以这是不必要的。
在这种情况下,我会使用第一种方法;)

shstlldc

shstlldc3#

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

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

s71maibg4#

实际上,有相反的观点:使用 this 对于类的变量,请始终确定此变量属于谁。或者另一个:如果局部变量和类变量之间存在冲突,请使用一个。
在我的工作中,我使用第二个:douse this 除非我必须这么做。代码中的字数越少,问题就越少。
所以在你的例子中,你可以使用任何变体。

rbpvctlc

rbpvctlc5#

它们在功能上都是等价的。
你需要 this 仅当您需要确保引用的是示例变量,而不是局部变量或参数时。如果构造函数的参数 num 以及 den ,你需要写

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

指定要分配参数 num 到示例变量 num .
然而,由于这些方法没有歧义,它们都将起作用。您还可以访问变量 r.num 以及 r.den 直接地,因为即使它们是私有的,它们仍然可以被同一个类访问,而不仅仅是同一个示例。
我会把它写成

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

vyswwuz26#

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

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

r6l8ljro7#

按照洛萨的回答,如果 multiply 方法将返回一个全新的有理数距离。
我甚至会使这个方法对类是静态的,因为它只是 RationalNumber s、 而不是与修改它的类的单个示例交互的东西。
这样,你可以这样称呼它:

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());
}

相关问题