Java中参数传递探究

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


猜你喜欢

转载自blog.csdn.net/main_958593250/article/details/76138092