Java中参数传递探究

来源:互联网 发布:修复tf卡数据 编辑:程序博客网 时间:2024/06/06 02:37

Java中的参数传递,《Java编程思想》是这样解释的:

目前存在两种存在明显区别的见解,其间的分歧归根到底是由于对“句柄”的不同解释造成的:

(1) Java 按值传递任何东西。若将基本数据类型传递进入一个方法,会明确得到基本数据类型的一个副本。但若将一个句柄传递进入方法,得到的是句柄的副本。所以人们认为“一切”都按值传递。

(2) Java 主要按值传递(无自变量),但对象却是按引用传递的。得到这个结论的前提是句柄只是对象的一个“别名”,所以不考虑传递句柄的问题,而是直接指出“我准备传递对象”。由于将其传递进入一个方法时没有获得对象的一个本地副本,所以对象显然不是按值传递的。

所以,这本业界圣书的作者也说:我打算在本书剩下的部分里回避这个问题。大家不久就会知道,这个问题争论下去其实是没有意义的。


结论:

①存在上述两种见解,其原因是所站角度不同导致的。但是,Sun公司似乎在某种程度上支持第二种见解。

②基本数据类型是值传递,传入函数的是该数据的副本;同样,引用数据类型传入函数的是这个引用的副本。


案例:

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';    }}
分析:change函数中的str是ex.str这个引用的副本,这个引用副本指向的对象变为"test ok"不会的ex.str产生任何影响;同样,change函数中的ch也是ex.ch这个引用的副本,二者指向的是同一块内存,函数中ch[0]='c'这一操作就把内存中的值变成了'c'。所以最终输出的结果是:

hello and cb

那么如果我们修改change函数,修改后如下:

    public void change(String str,char ch[]){        str="test ok";        ch =new char[]{'A','B', 'C'};    }
程序执行后的结果就是

hello and ab