我是编程和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;
}
答案 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
)修改对象的属性。