【问题标题】:Variable Scope Example Explanation变量范围示例说明
【发布时间】:2012-05-01 16:04:04
【问题描述】:
public class Arcane {

    static int x;
    int y;

    public Arcane(int x) {
        int y = x + 1;
        this.y = y;
    }

    public void increment() {
        y += x;
    }

    public void print() {
        System.out.println(y);
    }

    public static void main(String[] args) {
        x = 5;
        {
            int x = 2;
            Arcane t = new Arcane(x);
            t.increment();
            t.print();
        }
    }
}

据我了解,程序打印出 8 但我不知道为什么。我尝试插入 x=5。

【问题讨论】:

  • 在 this.y 之后值 5 是否为 y 递减?
  • 我正在寻找解释为什么 t 最终是 8
  • 你没有得到错误是因为你没有声明变量 x( where x = 5)

标签: java scope


【解决方案1】:

首先将 5 放入静态变量 x:x = 5;

然后您创建另一个在内部范围内有效的 x。它的值为 2,您将其发送给 Arcane 的构造函数,该构造函数将 y 计算为 x+1(本地 x),即 2+1=3。 此时

static x = 5;
y = 3;

现在您将计算y 的新值的增量称为y+=x,即与y = y + x 完全相同。即3+5=8

然后打印包含 8 的 y。

我希望这会有所帮助。

【讨论】:

    【解决方案2】:
    public static void main(String[] args) {
        x =  5; // static x is 5
        {
            int x = 2; //local x is 2
            Arcane t = new Arcane(x); //new arcane with local x = 2
            t.increment(); // add static x (5) to field y which is 3, = 8
            t.print(); //print 8
        }
    }
    

    【讨论】:

      【解决方案3】:
      public Arcane(int 2) {
           int 3 = 2 + 1;
           this.y = 3;
      }
      
      public void increment() {
          y += 5; // from static int x -> 8
      }
      

      【讨论】:

        【解决方案4】:

        当您执行以下操作时,您将传递 x=2;

        奥术 t = 新奥术(2);

        然后在构造函数中,y的值就变成了。 y=2+1=3

        公共奥术(int x){ int y = x + 1;这个.y = y; }

        回到您的 main 方法,以下方法调用分配 y=x+y 的值,即 5+3=8

        t.increment();

        【讨论】:

          【解决方案5】:

          这就是为什么。

          静态整数 x;

          是一个静态变量,行:

          x = 5;

          修改这个静态变量。

          int x = 2;

          是影子变量,不用说,不影响早期初始化的静态变量。通过阴影变量创建一个对象。
          此时 y = 2 + 1 = 3。

          t.increment()

          将 y 的值更改为 3 + 5。
          此时你得到了 y = 8 作为最终结果,这完全是关于作用域和阴影,你需要熟悉的基本编程概念。

          【讨论】:

            猜你喜欢
            • 2012-05-22
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-11-19
            • 1970-01-01
            • 2012-06-11
            相关资源
            最近更新 更多