Java的方法参数-想想挺有趣的问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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核心技术·卷中的解释

 

基本数据类型(byteintcharlongfloatdoublebooleanshort)

引用类型(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章       数组为什么特殊

以上是关于Java的方法参数-想想挺有趣的问题的主要内容,如果未能解决你的问题,请参考以下文章

python [代码片段]一些有趣的代码#sort

java 方法中如何在返回类型使用泛型

php 有趣的代码片段在某些时候可能会有用。

一道经典面试题:字符串在Java中如何通过“引用”传递

偶然看到挺有趣一些

Visual Studio 自定义代码片段在方法定义的参数列表中不起作用