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中的机制如下:

      

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章       数组为什么特殊