2012-02-20 90 views
1

为什么变量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); 
    } 
} 
+1

因为参数是按值传递的,而不是通过引用传递。另请参阅http://en.wikipedia.org/wiki/Evaluation_strategy – 2012-02-20 11:51:54

+0

@FelixKling我该如何解决这个问题(更新s) – sprabhakaran 2012-02-20 11:55:39

+0

@dangerous检查我的答案.. – 2012-02-20 11:57:01

回答

2

sgetVal()没有改变的是一个局部变量,它确实发生了改变 - 但只有在getVal()scope

s的值传递给getVal()by value - 因此只有副本被更改,而不是原来的。

6

正如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的价值 - 但你真的没有。 xy的值只是引用到一个对象...... xy指的是同一个对象,并且append调用已更改对象内的数据。我喜欢在这里使用的比喻是房屋:作为方法的来电者,我可以给你一张纸,上面写着我的地址。该地址相当于参考,而我的房子是对象

你可以改变两两件事:

  • 你可以去画我的前门红色,这是作出改变的对象。下次我看到我的房子时,我会看到这种变化。
  • 您可以更改写在纸上的地址。

这些都不会改变“我住的地方” - 无论您做了什么,我对“我的房子”的引用的副本与以前相同。

当涉及到类的行为导致了一个普遍的说法,即“Java通过引用传递基元的值和对象” - 这简直是不真实的。 Java通过所有参数的值 - 但你需要明白,表达式的值是总是无论是原始值还是引用,从来都不是对象。

+0

非常好的解释! – 2012-02-20 14:57:25

1

参数按值传递。在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); 
    } 
} 
+0

+1为值传递 – AlexS 2012-02-20 12:00:09

2

您传递值为s的值为0; 然后,因为它是按值传递的,所以在getVal中内部创建一个新变量,该变量初始化为0.它获取赋值2。 然后,该变量将与该函数的结尾一起删除。

+0

+1为值传递 – AlexS 2012-02-20 11:59:02

1

参数是按值传递的,所以在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); 
    } 
} 
+0

请介意downvote的原因... – 2012-02-20 11:58:41

+0

我有更新太多的论据。回报并不能解决我的问题。 – sprabhakaran 2012-02-20 12:05:49

+0

@spk:你没有提出你的问题 - 你问过为什么一小段代码按照它的方式工作。许多答案都解释了原因。也许如果你问了一个关于你想要达到的东西的问题,你会继续...... – 2012-02-20 15:04:06

0

Java通过引用操纵对象,并且所有对象变量都是引用。但是,Java不会通过引用传递方法参数;它通过价值传递它们。

就拿fun()方法,例如:

public void fun(int var1, int var2) 
{ 
    int temp = var1; 
    var1 = var2; 
    var2 = temp; 
} 

当乐趣()返回时,作为参数传递的变量将仍持有其原始值。如果我们将参数类型从int更改为Object,该方法也会失败,因为Java也会通过值传递对象引用。