在Java中传递参数

时间:2011-12-16 21:29:18

标签: java arguments

这里有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 ..?

6 个答案:

答案 0 :(得分:5)

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

如果您希望更改对调用者可见,您可以传递一个包裹在对象内的int。例如,您可以使用课程org.apache.commons.lang.mutable.MutableInt

答案 1 :(得分:1)

Java通过Value传递,它生成一个与原始变量引用完全不相关的副本,这意味着它无权更改原始int。对于基元和对象引用也是如此。

您可以使用AtomicInteger或类似内容来实现您的目标。

答案 2 :(得分:1)

根据您的建议,原始变量按值传递而不是参考。

答案 3 :(得分:1)

正如其他人所说,Java默认传递byValue,这意味着你只是在函数中获取副本。您可以传递byReference,它将传递指向对象的指针并允许您直接编辑,但这不是最佳实践。我建议这样做:

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 

答案 4 :(得分:1)

Java传递ByValue,意味着您作为参数放置的对象的值被传递,而不是对象本身,因此

val=11;
changeInt(val);

完全相同
int val=11;
int val2=val
changeInt(val2);

int是一个原语,原语不会“包装”一个值,你可以尝试使用一个Integer类,或者创建自己的类来存储一个整数,然后改变那个类的整数值。如果设置正确,有时会通过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 :(得分: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);


}

}

看看这段代码::

你可以看到,在这种情况下,change()内部的动作影响了传递给方法的对象

将对象引用传递给方法时,引用本身将传递给方法call-by-value。因此,参数接收此参数中使用的引用的副本。结果对参数的更改(例如使其引用不同的对象)不会影响用作参数的引用。但是,由于参数和参数都引用同一个对象,因此通过参数的更改将影响参数所引用的对象。