[英]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.