首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java浅、深拷贝JLS

Java浅、深拷贝JLS
EN

Stack Overflow用户
提问于 2011-09-21 15:58:30
回答 2查看 151关注 0票数 0

可能重复: Java引用传递问题

在下面的代码中,将调用methodA,然后将调用委托给methodB,在此过程中,methodB使用字符串文本"bbb“分配输入参数,但是,回到methodA,字符串文本不存在,JLS的哪个部分定义了此行为?

代码语言:javascript
复制
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");
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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中的标识符可以用作方法或构造函数正文中引用形式参数的简单名称。

票数 4
EN

Stack Overflow用户

发布于 2011-09-21 16:01:28

Java是通过值传递的,而不是通过引用传递的。

方法签名是对此的缩写:

代码语言:javascript
复制
methodB() {
    String a = arguments[0];

也就是说,它是一个不同的参考。当您分配给'a‘时,您是将其赋值给作为方法签名一部分创建的引用'a',而不是分配给包含调用methodB()的代码块中声明的'a’。

但是,如果值是对象,则可以修改它。

代码语言:javascript
复制
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
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7502892

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档