关闭

Java参数传递的问题

标签: java参数传递
56人阅读 评论(0) 收藏 举报

有一道题

下列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只存在值传递的人都会举类似的例子,但其实我觉得这个只是体现 了局部变量的特点而已。

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:59次
    • 积分:11
    • 等级:
    • 排名:千里之外
    • 原创:1篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条
    文章存档
    阅读排行
    评论排行