【问题标题】:Can't decrease value of int variable不能减少 int 变量的值
【发布时间】:2015-10-31 09:51:44
【问题描述】:

我创建了 4 个类,一个 MainP 类,以及其他 Ex2Ex3Ex4(3 和 4 扩展 2)。当我从一个减少另一个对象的 int 变量的对象中调用 a 时,它只会在第一次调用时执行此操作。

这些是类:

Ex2:

protected int par;

public int getPar() {
    return par;
}

public void setPar(int par) {
    this.par = par;
}

Ex3:

private int par;

public Ex3(int par) {
    this.par = par;
}

public void bar(Ex2 b) {
    b.setPar(par - 10);
}

public int getPar() {
    return par;
}

public void setPar(int par) {
    this.par = par;
}   

Ex4 与 Ex3 相同。

主要:

public class MainP {
    public static void main(String[] args) {

        Ex3 kaka = new Ex3(100);
        Ex4 tana = new Ex4(100);

        kaka.bar(tana);

        System.out.println(tana.getPar());

        kaka.bar(tana);

        System.out.println(tana.getPar());
    }
}

输出:

90
90

我不明白为什么par 在第一次通话中减少并在第二次通话中停止。我想它以某种方式进行了校准,但我不明白为什么。

编辑: 好吧,我理解我的愚蠢错误,但我有一个新错误。 我将方法更改为:

    public void bar(Ex2 b){
    b.setPar(b.par-=10);
}

现在我的输出是:

-10

-20

为什么方法将 b.par 更改为 -10?如果我这样做: tana.setPar(tana.par-=10);在main方法中,将变量更改为public,不会将tana的值更改为-10,而是从100减少。

【问题讨论】:

  • Ex3 中的 bar 方法将 Ex2 中 par 的值设置为 Ex3par 的结果减去 10。Ex3 中的这个值永远不会改变,因此这两个调用将 Ex2 中的 par 设置为 90 (100 - 10)。

标签: java variables int


【解决方案1】:

您调用了 b.setPar(par-10);

'par' 是 kaka 的一个实例。 b.setPar(par-10) 正在更新 tana 实例中的“par”字段的值。您从未真正更新 kaka 实例中的“par”字段。当您拨打第二个电话时,您实际上只是执行了两次相同的计算,得到了相同的答案。

【讨论】:

    【解决方案2】:
    1. 您创建了一个Ex3 类型的对象,变量par 的值等于100
    2. 您创建了一个Ex4 类型的对象,变量par 的值等于100
    3. 通过在kaka 上调用bar(),您可以将tanapar 值设置为kaka.par(即100)-10,所以tana.par 现在是@987654333 .
    4. 通过第二次在kaka 上调用bar(),您将tanapar 值设置为kaka.par(仍然是100)-10,所以tana.par 再次出现90.

    只需尝试使用笔和纸跟踪您的代码,问题就会很快显现出来。

    【讨论】:

    • @DanielSeg,别担心,只要养成逐条分析代码的习惯,并确保您了解变量会发生什么。它肯定会让你成为一个更好的程序员。此外,如果您认为您的问题已得到解答,请不要忘记接受其中一个答案。
    【解决方案3】:

    我们来分析一下代码: 您创建了 kaka 和 tana,它们的 par = 100。

    然后你告诉卡卡设置塔娜的标准。 (卡卡)par-10 = 100 - 10 = 90

    然后你再次告诉 kaka 设置 tana 的标准。 但是卡卡的标准还是一样的。 所以你设置 100 - 10 = 90。 你只是不降低卡卡的标准。

    【讨论】:

      【解决方案4】:
      public void bar(Ex2 b){
          b.setPar(par-10);
      }
      

      没有前缀,par 指的是this.par,而不是b.par,所以本质上,你是在说:

      b.par = this.par - 10;
      

      this.par 在两次调用之间不会发生变化,所以很自然你会看到90 两次。

      你可能想要:

      b.par = b.par - 10;
      

      b.par -= 10;
      

      【讨论】:

        【解决方案5】:
        public void bar(Ex2 b){
            b.setPar(par - 10);
        }
        

        在这里,您将par - 10 的值设置为b,其中par 不是b 的字段。因为它没有改变你 2 次,所以将 b par 字段设置为相同的值 - 90。

        【讨论】:

          猜你喜欢
          • 2021-03-19
          • 2022-12-09
          • 1970-01-01
          • 2011-02-28
          • 1970-01-01
          • 2020-03-25
          • 2021-11-16
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多