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核心技术·卷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章       数组为什么特殊

时间: 2024-08-03 20:53:19

Java的方法参数-想想挺有趣的问题的相关文章

JAVA获取方法参数名的分析(一)

关于题目 首先解释一下题目. 我们知道, Java通过反射,可以从一个类得知它有哪些方法,有哪些变量,也可以知道每个方法中有哪几个什么类型的传入参数.但有一个东西反射取不到,那就是我们对方法传入参数的命名. 取得传入参数的名字有什么意义? 对这个问题的探究,源于在写一个测试类时候的需求.假设我们有一个类需要测试,这个类中有数十个方法.为每个方法编写测试类,将耗费大量的时间和精力.因此我有一种想法,就是通过java的反射,获得这个类所有的方法,再通过传入参数的名字和参数类型,来生成一些符合要求的数

Java调用方法参数究竟是传值还是传址?

之前阅读<Head First Java>的时候,记得里面有提到过,Java在调用方法,传递参数的时候,采用的是pass-by-copy的方法,传递一份内容的拷贝,即传值.举一个最简单的例子: 1 public class Test { 2 public static void main(String[] args) { 3 int numberA = 1; 4 int numberB = 2; 5 swap(numberA, numberB); 6 System.out.println(nu

java方法参数

java程序设计语言总是采用按值调用.也就是说,方法得到的是所有参数值的一个拷贝,特别:方法不能修改传递给它的任何参数变量的内容. 方法参数共有两种类型: 1.基本类型(数字,布尔值). 2.对象引用. java中方法参数的使用情况: 1.一个方法不能修改一个基本数据类型的参数(数值 布尔型). 2.一个方法可以改变一个对象参数的状态. 3.一个方法不能让对象参数引用一个新的对象. 一个方法不可能修改一个基本数据类型的参数,而对象引用作为参数就不同了

Java数据类型和方法参数

目录 [tpc] Java数据类型 Java变量类型可以分为两种,一种是存储在堆栈中的基本数据类型,一种是存储在堆里的Java对象. 基本数据类型有9种,4种整型,2种浮点型,1种Unicode字符型,1种布尔类型,1种void类型. void类型用于方法返回值,表示没有返回值. 基本类型 大小(字节) 包装器类型 byte 1 Byte short 2 Short int 4 Integer long 8 Long float 4 Float double 8 Double char 2 Ch

Java方法参数的传递方式

程序设计语言中,将参数传递给方法(或函数)有两种方法.按值传递(call by value)表示方法接受的是调用者提供的值:按引用调用(call by reference)表示方法接受的是调用者提供的变量地址.Java程序设计语言都是采用按值传递.下面通过例题进行说明: 1 public class ParamTest { 2 public static void main(String[] args) { 3 /* 4 *Test1: Methods can't modify numeric

方法参数(值调用,引用调用)

Java程序设计语言总是采用按值调用.也就是说,方法得到的总是所有参数的一个拷贝,特别是,方法不能修改传递给它的任何参数变量的内容. double percent = 10; harry.raiseSalary(percent); //方法调用之后,percent的值还是10 然而,方法参数共有两种类型: 1.基本数据类型(数字.布尔值) 2.对象引用 方法得到的是对象引用的拷贝,对象引用及其它的拷贝同时引用同一个对象. public static void swap(Employee x, E

深入理解Java中方法的参数传递机制

形参和实参 我们知道,在Java中定义方法时,是可以定义参数的,比如: public static void main(String[] args){ } 这里的args就是一个字符串数组类型的参数. 在程序设计语言中,参数有形式参数和实际参数之分,先来看下它们的定义: 形式参数:是在定义函数名和函数体的时候使用的参数,目的是用来接收调用该函数时传入的参数,简称"形参". 实际参数:在主调函数中调用一个函数时,函数名后面括号中的参数称为"实际参数",简称"

Java基础学习笔记十二 类、抽象类、接口作为方法参数和返回值以及常用API

不同修饰符使用细节 常用来修饰类.方法.变量的修饰符 public 权限修饰符,公共访问, 类,方法,成员变量 protected 权限修饰符,受保护访问, 方法,成员变量 默认什么也不写 也是一种权限修饰符,默认访问, 类,方法,成员变量 private 权限修饰符,私有访问, 方法,成员变量 static 静态修饰符 方法,成员变量 final 最终修饰符 类,方法,成员变量,局部变量 abstract 抽象修饰符 类 ,方法 我们编写程序时,权限修饰符一般放于所有修饰符之前,不同的权限修饰

【解惑】Java方法参数是引用调用还是值调用?

最近找实习,在笔试时候做了下面这道题:求下面代码的输出结果. public class MyClass { static void aMethod(StringBuffer sf1,StringBuffer sf2){ sf1.append(sf2); sf2=sf1; } public static void main(String[] args){ StringBuffer sf1=new StringBuffer("A"); StringBuffer sf2=new String