java类中全局变量的范围及其在同一类

时间:2015-06-04 19:03:52

标签: java scope

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

    int b;
    int inc(int b){
        b++;
        return b;
    }
    b = 5;
    inc(b);

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

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

    public void setName ( String n ) {
        name = n;
    } 

4 个答案:

答案 0 :(得分:5)

  

换句话说,为什么变量会被遗忘"在上面的例子中,但是记得"在一套方法?

inc方法中,您根本不会更改名为b字段。您已经有一个名为b参数,因此每次代码在方法中引用b时,它都会引用参数而不是字段。这称为 shadowing 。如果您将其更改为:

int b;
int inc(int b) {
    this.b++;
    return this.b;
}

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

基本上,您需要考虑inc方法的用途:

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

答案 1 :(得分:1)

方法变量是局部变量。它们的范围仅限于方法执行。如果你想要改变类变量,你必须通过执行以下任一操作将它分配给类变量,就像在setter case中一样。

 void inc(int b){
        b++;
        this.b=b ;        
  }

int inc(int b){
        b++;
    return b ;        
  }

然后

b = inc(b);

答案 2 :(得分:0)

听起来你并不理解OOP(面向对象编程)。

Set方法是类的成员,它跟踪内部更改。

通过使用setter,您可以更改类实例的内容。它不会被遗忘"因为首先创建了类的实例(而函数不是)。

有关类实例的更多信息,请参阅object creation

答案 3 :(得分:0)

你只是偶然发现内置插件(boolean, char, byte, short, int, long, float, double)和对象的区别。如你所说:Java is pass-by-value。总是。然而,内置插件和对象之间存在细微差别。当您将对象作为参数传递时(就像在setter中一样),实际上传递了引用的值(即内存位置),而不是实际的对象本身。此外,两个示例中的用例不同:一个方法(inc)修改参数,而另一个方法(setName)修改对象的属性。