繁体   English   中英

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

[英]Scope of global variables in a java class and their behavior in methods of the same class

我是编程和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之外保持其值? 换句话说,为什么在上面的示例中变量更改“忘记”,而在set方法中“记住”了呢?

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

换句话说,为什么在上面的示例中变量更改“忘记”,而在set方法中“记住”了呢?

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

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

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

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

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

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

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

要么

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

然后

b = inc(b);

听起来您好像不了解OOP(面向对象的编程)。

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

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

有关类实例的更多信息,请参见对象创建

您只是偶然发现了内置函数( boolean, char, byte, short, int, long, float, double )和Objects的区别。 正如您已经说过的: Java是按值传递 总是。 但是,内置项和对象之间存在细微的差异。 当您将对象作为参数传递时(就像在setter中一样),您实际上传递的是引用的值(即存储位置),而不是实际的对象本身。 此外,在两个示例中,用例也不同:一种方法( inc )修改参数,而另一种方法( setName )修改对象的属性。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM