Java参数传递的问题

有一道题

下列java程序的输出结果为__

public class Example{
    String str=new String("hello");
    char[]ch={'a','b'};
    public static void main(String args[]){
        Example ex=new Example();
        ex.change(ex.str,ex.ch);
        System.out.print(ex.str+" and ");
        System.out.print(ex.ch);
    }
    public void change(String str,char ch[]){
        str="test ok";
        ch[0]='c';
    }
}

A.hello and ab
B.hello and cb
C.hello and a
D.test ok and ab
E.test ok and cb
F.test ok and c

正确答案是B。

JAVA两种数据类型:基本类型和引用类型。 基本类型作为参数传递时是按值传递,方法中使用的是参数的值拷贝,原参数不会得到改变。传递引用类型时的情况颇有争议,目前主要有两种说法:1.Java中只有一种传递的方式即按值传递,引用类型作为参数传递时传递的实际是该对象引用的值。2.Java中原始类型按值传递,对象按引用传递。在我看来,这两种说法意思是一样的,只是不同的人表述习惯不同。事情其实很简单,“Java manipulates objects ‘by reference,’ but it passes object references to methods ‘by value.”

Java按引用传递时,方法会得到原始对象的引用复制即内存地址,通过这个复制得到的引用是可以改变原对象的状态的。如题中的char ch[]就是引用传递,在change方法中对ch[0]赋值,就改变了原ch数组的内容。而String str也是引用传递,原字符串str却没有改变的原因是String类型的特殊性,String类型是不可更改的,任何试图改变String的行为其实都是创建了一个新的String对象,让原来的引用指向这个新的String对象。因此change方法中 str=”test ok”;其实是生成了一个新的String对象”test ok”,并让str指向了它,而str只是一个局部变量,change方法结束后就被自动回收了,与Example类中的全局变量str完全没产生关系,自然也不会将其改变。如果想改变全局变量str,只需要在change方法中指定this.str就可以了。
这里写图片描述

另外还需要注意,如果只是在方法中更改引用指向的对象,而不通过引用对原对象作实质性改变的话,是不会对原对象产生影响的。因为方法传递进来的引用只是原引用的一个拷贝,是局部变量,随着方法结束也就失去作用了,是不会对原对象产生影响的。比如下面:
原对象没有改变
很多认为Java只存在值传递的人都会举类似的例子,但其实我觉得这个只是体现 了局部变量的特点而已。

阅读更多
文章标签: java 参数传递
想对作者说点什么? 我来说一句

Java的引用和函数参数传递

2018年03月17日 17KB 下载

java参数传递

2011年11月29日 10KB 下载

Java参数传递PPT

2008年04月20日 873KB 下载

没有更多推荐了,返回首页

不良信息举报

Java参数传递的问题

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭