2015-10-15 65 views
1

我试图在作为参数传递给函数时更改变量的值,但原始值保持不变,所以是有可能改变?(I,E在下面的代码我想x的值是11)当它作为参数传递给函数时,是否可以更改原始变量

public class Runy { 

public static void main(String [] args) 
{ 


    int x=10; 
    int y=change(x); 

    System.out.println(x); 
    System.out.println(y); 

} 
public static int change(int a) 
{ 
    a+=1; 
    return a; 
} 

}

+1

没有,因为Java的仅是按值传递。 – fge

+1

@fge存回x? –

+0

@sᴜʀᴇsʜᴀᴛᴛᴀ当然,你的答案提到;但是对于OP想要在提议的代码中执行的具体方式,答案仍然是“否”,因为我提到的原因;) – fge

回答

1

I,E在下面的代码我想要的值x为11)

根据您当前的代码,它将不可能的,但如果你想改变的x值,你不需要y然后,只需你可以做

int x=10; 
x=change(x); // store the return value of change back to 'x' 
0

你不能这样做,这样..不要试图改变参数值!

做这样的事情,而不是:

public static int change(int a) 
{ 
    return a + 1; 
} 

,并在你的主要方法:

x = change(x); 
+3

“永远不要尝试更改参数值!”因为...? – immibis

+0

它被认为是“不好的做法”...原始参数(在这种情况下)是通过值传递的,所以不需要甚至试图改变它。 – Pras

+0

IMO是一种个人风格的选择,而不是一个规则。 – immibis

0

当你传递一个变量与原始数据类型(如intbooleanfloat等) 。将的值传递给该方法,而不是参考的值。如果您想更改原始变量,您有两个选择:将新值从方法中传回;创建一个包装价值的类。

选项1:

int x = 10; 
x = change(x); 

int change(int x) { 
    return x + 1; 
} 

选项2:

class X { 
    private int x; 
    int getX() { 
     return x; 
    } 

    void setX(int x) { 
     this.x = x; 
    } 
} 

X x = new X(); 
x.setX(10); 
change(x); 

void change(X x) { 
    x.setX(x.getX() + 1); 
} 
+0

好的,即使当我传递包装类对象时,值也不会改变(假定引用的值是传递给非原始数据类型) –

1

可以改变作为参数或对象作为参数传递的字段传递数组的元素。

public static void change(int[] a) { 
    a[0] += 1; 
} 

可以使用这样的:

int a[] = new int[1]; 
a[0] = 10; 
change(a); 
System.out.println("a[0] = " + a[0]); 

static class A { 
    int val; 
} 

static void change(A a) { 
    a.val += 1; 
} 

可以使用这样的:

A a = new A(); 
a.val = 10; 
change(a); 
System.out.println("a.val = " + a.val); 
0

这是不可能的Java方法来改变作为参数传递给它的变量。这段代码运行之后:

int x = 10; 
change(x); 
System.out.println(x); 

x将总是含有10 - 没有什么可以在change写尽它的任何其他值。

作为替代方案,你可以让change返回新值,并使用

x = change(x); 
相关问题