2011-12-16 82 views
1

这里是Java的新手,请大家帮忙。在java中如何传递参数?为什么我无法在被调用的方法内更改调用方法中的参数值?在Java中传递参数

代码

public class PassTest { 
    public static void changeInt(int value) 
    { 
     value=55; 
    } 

    int val; 
    val=11; 
    changeInt(val); 
    System.out.println("Int value is:" + val);// calling modifier changeInt 
} 

输出

Int value is: 11

为什么它不是55 ..?

+1

此代码甚至不会编译 – stacker 2011-12-16 21:33:52

+0

只是一个片段..不完整..需要问这里的问题.. – sum2000 2011-12-16 21:35:44

+0

@stacker我不认为代码编译需要问一个问题 – Andy 2011-12-16 21:52:33

回答

1

的Java通过根据值,这意味着你把作为参数对象的值传递,而不是对象本身,因此

val=11; 
changeInt(val); 

不准确同样的事情,

int val=11; 
int val2=val 
changeInt(val2); 

int是一种原始的,原始数据没有“包装”的值,你可以尝试使用Integer类,或者使自己的类存储一个整数,然后更改THA t类整数值。如果设置正确,对象的实例有时会传递ByReference。这里有一个例子

MyStringClass.java

public class MyStringClass{ 

    private String string = null; 

    public MyStringClass(String s){ 
     string = s; 
    } 
    public String getValue(){ 
     return string; 
    } 
    public void setValue(String s){ 
     string = s; 
    } 
} 

,然后运作

public static void addTo(String s){ 
    s += " world"; 
} 
public static void addTo(MyStringClass s){ 
    s.setValue(s.getValue() + " world"); 
} 
public static void main(String[] args){ 
    String s = "hello"; 
    MyStringClass s1 = new MyStringClass("hello"); 
    addTo(s); 
    addTo(s1); 
    System.out.println(s);//hello 
    System.out.println(s1);//hello world 
} 

我会想知道为什么你需要改变的价值,而不是仅仅恢复了吗?是不是更容易?

5

Java按值传递,而不是引用。在您的方法中,value包含val的值的副本。修改副本不会更改原始变量。

如果您希望您的更改对调用者可见,则可以传递包含在对象中的int。例如,您可以使用类org.apache.commons.lang.mutable.MutableInt

1

爪哇经过数值,它使一个拷贝这是完全与原始变量的参考,这意味着它不能访问改变原有int DIS-相关联。原语以及对象引用也是如此。

你可以使用AtomicInteger或类似的东西来实现你想要做的事情。

1

原始变量按照您的建议通过值而不是引用传递。

1

正如其他人所说,默认情况下,Java通过值传递,这意味着您只是获得函数中的副本。您可以传递参考,它将传递一个指向该对象的指针并允许您直接编辑,但这不被视为最佳实践。我建议做这样的:

public class PassTest { 
public int changeInt(int value) 
{ 
    value = 55; 
    return value; 
} 
int val; 

val=11; 
val = changeInt(val); 
System.out.println("Int value is:" + val);// calling modifier changeInt 
0

这里是传递一个参数例:

class Test { 
int a,b; 

public Test(int j, int k) { 
    a=j; 
    b=k; 
} 
void change(Test ko){ 
    ko.a=ko.b+ko.a; 
    ko.a=ko.b-12; 


} 

} 


class sdf { 
public static void main(String[] args){ 
Test op=new Test(12,32); 
System.out.println(op.a+" "+op.b); 

op.change(op); 

System.out.println(op.a+" "+op.b); 


} 

}

看看这段代码::

你可以看到,在这种情况下,内化作用( )已影响传递给方法的对象

将对象引用传递给方法时,引用本身将传递给按值调用的方法。因此,该参数会收到副本。因此,对参数的更改(例如使其指向不同的对象)不会影响用作参数的参考。但是,由于参数和参数都指向同一个对象,因此通过参数进行更改将影响参数所反映的对象。