可能重复: Java引用传递问题
在下面的代码中,将调用methodA,然后将调用委托给methodB,在此过程中,methodB使用字符串文本"bbb“分配输入参数,但是,回到methodA,字符串文本不存在,JLS的哪个部分定义了此行为?
package sg.java.test2;
public class TestApple {
public static void main(String args[]){
methodA();
}
public static void methodA(){
String a = null;
methodB(a);
System.out.println(a);
}
public static void methodB(String a){
a = new String("bbb");
}
}发布于 2011-09-21 16:01:39
这是一个按值传递与按引用传递的问题。Java仅按值传递。当你打电话的时候
methodB(a)
引用a被复制;在methodB的上下文中,a是一个不同的变量,其值与methodA中的值相同。因此,在methodB中更改它时,methodA中的a仍然指向原始字符串。
这里起作用的另一个问题是字符串是不可变的,因此一旦设置了字符串,就不能更改它的值。从医生那里。
字符串是常量;它们的值在创建后不能更改。
你能做的就是
a = methodB();
并返回"bbb" in methodB。没有理由传递a,因为您没有对它进行操作;我认为您这样做只是为了尝试在调用methodB的上下文中更改a,而这是您无法做到的。
最后,JLS的相关部分是8.4.1,它说
当调用方法或构造函数(§15.12)时,实际参数表达式的值在执行方法或构造函数的主体之前初始化新创建的参数变量(每个声明的Type )。出现在DeclaratorId中的标识符可以用作方法或构造函数正文中引用形式参数的简单名称。
发布于 2011-09-21 16:01:28
Java是通过值传递的,而不是通过引用传递的。
方法签名是对此的缩写:
methodB() {
String a = arguments[0];也就是说,它是一个不同的参考。当您分配给'a‘时,您是将其赋值给作为方法签名一部分创建的引用'a',而不是分配给包含调用methodB()的代码块中声明的'a’。
但是,如果值是对象,则可以修改它。
class MyObj {
String prop;
public MyObj(String s) { prop = s; }
public MyObj() { }
}
public void methodB(MyObj o) {
o.prop = "foo";
}
public void methodA() {
MyObj a = new MyObj();
System.out.println(a.prop); // null
methodB(a);
System.out.println(a.prop); // foo
}https://stackoverflow.com/questions/7502892
复制相似问题