这里有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 ..?
答案 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。因此,参数接收此参数中使用的引用的副本。结果对参数的更改(例如使其引用不同的对象)不会影响用作参数的引用。但是,由于参数和参数都引用同一个对象,因此通过参数的更改将影响参数所引用的对象。