java类中全局变量的范围及其在同一类方法中的行为

Lai*_*ang 3 java scope

我是编程和Java的新手,我对同一类方法中全局变量的行为感到困惑.在我正在学习的课程提供的练习题中,我被问到执行后变量b的值是多少inc(b).

    int b;
    int inc(int b){
        b++;
        return b;
    }
    b = 5;
    inc(b);
Run Code Online (Sandbox Code Playgroud)

答案是5而不是6,我理解这是因为Java是按值传递的,并且方法中的所有参数inc都被遗忘了.

另一方面,在java类中,建议为所有实例变量编写set和get方法.那么我的问题是,为什么setter能够更改实例变量并将其值保持在setter之外?换句话说,为什么变量在上面的例子中被"遗忘"了,但在set方法中"记住"了?

    public void setName ( String n ) {
        name = n;
    } 
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 5

换句话说,为什么变量在上面的例子中被"遗忘"了,但在set方法中"记住"了?

在您的inc方法中,您根本不会更改被调用的字段b.你有一个名为的参数b,所以每次代码b在方法中引用时,都会引用参数而不是字段.这称为阴影.如果您将其更改为:

int b;
int inc(int b) {
    this.b++;
    return this.b;
}
Run Code Online (Sandbox Code Playgroud)

...然后该参数将被忽略,它将增加该字段.

基本上,您需要考虑您希望该inc方法执行的操作:

  • 它是否意味着增加其参数并返回新值?如果是这样,它也可能是静态的 - 它不与实例的任何状态交互
  • 是否意味着增加字段并返回新值?如果是这样,它应该是无参数的 - 它不使用参数.
  • 是否意味着将字段设置为参数值然后递增?如果是这样,我强烈建议改变设计(我知道这只是一个例子)并且绝对是参数名称的变化.