Java的方法参数-想想挺有趣的问题
一直认为Java的方法参数都是传递值,调用后对本身不影响。
Java不存在C/C++中的指针,在快速排序中,传入的数组,却发生了值的改变。由此引发的思考:
//为方便举例,以下为部分快速排序伪代码
传入的数组,在递归中,数组值被操作。
void quickSort(int s[], int l, int r){
if (l < r){
quickSort(s, l, i - 1);
quickSort(s, i + 1, r);
}
}
结论:Java方法参数中传递的是值,在参数是引用类型(如数组),传入的是数组的内存地址的值,可以对其进行操作。
原理:
Java中的机制如下:
核心技术·卷1 中的解释)
基本数据类型(byte、int、char、long、float、double、boolean和short)
引用类型(reference type)指向一个对象,不是原始值,指向对象的变量是引用变量。
(类似C/C++中的指针,以特殊的方式指向对象实体(具体的值),存储一个内存地址)
注意:String 、数组 、 接口 、 类都是引用类型。
数组的讨论:
int[] a=new int[3]; double[] b=new double[3];
String[] s=new String[3]; example[] e=new example[3];
(),数组标识符(a,b,s,e)其实只是一个引用,指向在堆中创建的一个真实对象。
对象数组(s, e)和基本类型数组(a, b)在使用上是相同的,唯一的区别(数组中保存的值)是对象数组保存的是引用,基本类型数组直接保存基本类型的值。
参考 Java编程思想 16.2节 数组为什么特殊)
Java中的引用,相当于一个受限指针,在new创建对象时,获得一个引用。
如 String ex=new String(“example”);
故,在快速排序的递归操作中,传入了数组的地址值,在每次递归中,对数组进行操作,会实际改变数组的值。
//才疏学浅,不当之处,望不吝指正。
参考: <Java核心技术·卷1> 章节4.2 方法参数
进阶阅读:<Java编程思想> 第16章 数组为什么特殊