为什么变量s 2变量不能改变
public class Test {
static void getVal(int s) {
s= 2;
}
public static void main(String arg[]) {
int s = 0;
getVal(s);
System.out.println(s);
}
}
为什么变量s 2变量不能改变
public class Test {
static void getVal(int s) {
s= 2;
}
public static void main(String arg[]) {
int s = 0;
getVal(s);
System.out.println(s);
}
}
正如Felix在评论中所说的,Java参数是按值传递的。
它更清晰,如果我们使用不同的变量名:
public static void main(String arg[]) {
int x = 0;
method(x);
System.out.println(x); // Prints 0
}
static void method(int y) {
y = 2;
}
当你调用method(x)
的x
价值进行评估,并将该值成为y
的初始值。这就是只有两个变量之间的连接。更改y
的值不会更改x
的值。
现在可以出现仿佛这不是这种情况:
public static void main(String arg[]) {
StringBuilder x = new StringBuilder();
method(x);
System.out.println(x); // Prints "appended"
}
static void method(StringBuilder y) {
y.append("appended");
}
它看起来有点像你已经改变了的x
的价值 - 但你真的没有。 x
和y
的值只是引用到一个对象...... x
和y
指的是同一个对象,并且append
调用已更改对象内的数据。我喜欢在这里使用的比喻是房屋:作为方法的来电者,我可以给你一张纸,上面写着我的地址。该地址相当于参考,而我的房子是对象。
你可以改变两两件事:
这些都不会改变“我住的地方” - 无论您做了什么,我对“我的房子”的引用的副本与以前相同。
当涉及到类的行为导致了一个普遍的说法,即“Java通过引用传递基元的值和对象” - 这简直是不真实的。 Java通过所有参数的值 - 但你需要明白,表达式的值是总是无论是原始值还是引用,从来都不是对象。
非常好的解释! – 2012-02-20 14:57:25
参数按值传递。在Method getVal中,s是另一个生成的变量。变更对其他变量没有影响。要获得此效果,您可以这样做:
public class Test {
static int getVal(int s) {
s= 2;
return s;
}
public static void main(String arg[]) {
int s = 0;
s = getVal(s);
System.out.println(s);
}
}
+1为值传递 – AlexS 2012-02-20 12:00:09
您传递值为s的值为0; 然后,因为它是按值传递的,所以在getVal中内部创建一个新变量,该变量初始化为0.它获取赋值2。 然后,该变量将与该函数的结尾一起删除。
+1为值传递 – AlexS 2012-02-20 11:59:02
参数是按值传递的,所以在getVal
中创建了一个新的局部变量。为了解决这个问题,你应该返回值并在调用方法中赋值给变量。试试这个
public class Test{
static int getVal(int s){
s= 2;
return s;
}
public static void main(String arg[]){
int s = 0;
s = getVal(s);
System.out.println(s);
}
}
请介意downvote的原因... – 2012-02-20 11:58:41
我有更新太多的论据。回报并不能解决我的问题。 – sprabhakaran 2012-02-20 12:05:49
@spk:你没有提出你的问题 - 你问过为什么一小段代码按照它的方式工作。许多答案都解释了原因。也许如果你问了一个关于你想要达到的东西的问题,你会继续...... – 2012-02-20 15:04:06
Java通过引用操纵对象,并且所有对象变量都是引用。但是,Java不会通过引用传递方法参数;它通过价值传递它们。
就拿fun()
方法,例如:
public void fun(int var1, int var2)
{
int temp = var1;
var1 = var2;
var2 = temp;
}
当乐趣()返回时,作为参数传递的变量将仍持有其原始值。如果我们将参数类型从int更改为Object,该方法也会失败,因为Java也会通过值传递对象引用。
这是因为java将值作为参数传递给方法的事实。所以,当你调用的不是s功能GETVAL(S)它通过S的值是0
http://www.javaworld.com/javaworld/javaqa/2000-05/03-qa-0526-pass.html
本文会告诉你的故事。
因为参数是按值传递的,而不是通过引用传递。另请参阅http://en.wikipedia.org/wiki/Evaluation_strategy – 2012-02-20 11:51:54
@FelixKling我该如何解决这个问题(更新s) – sprabhakaran 2012-02-20 11:55:39
@dangerous检查我的答案.. – 2012-02-20 11:57:01