Java语言中参数值传递和引用传递比较

来源 :科教导刊 | 被引量 : 0次 | 上传用户:QINJF2000000
下载到本地 , 更方便阅读
声明 : 本文档内容版权归属内容提供方 , 如果您对本文有版权争议 , 可与客服联系进行内容授权或下架
论文部分内容阅读
  摘要方法的参数有形式参数和实际参数两种形式。根据参数数据类型的不同,当实际参数向形式参数传递值时,有着不同的传递方式。对于初学者而言,由于不能深入理解参数传递在内存中是如何分配的,容易导致参数传递错误。本文从实例出发,讲述参数传递的两种方式,为开发者提供借鉴。
  关键词形式参数 实际参数 值传递 引用传递
  中图分类号:TP312文献标识码:A
  
  Parameter Values Transfer and Pass by Reference Comparison in Jave
  PENG Jian, TANG Ying
  (Jiangxi Financial and Economics Vocational School, Jiujiang, Jiangxi 332000)
  AbstractParameter of method have two forms of formal parameters and actual parameters. According to different types of parameters data, when the actual parameters transfer value to formal parameters, it has different transfer mode. For beginners, they unable to deeply understand how parameters transfer allocate in memory, it is easy to cause the parameters transfer errors. This paper, starting from examples to talk about the two passing ways of parameter passing.
  Key wordsformal parameters; actual parameters; value transfer; pass by reference
  
  0 引言
  在Java語言中,成员方法可以有多个不同数据类型的参数,也可以一个参数都没有。对于参数我们需要区分形式参数和实际参数的概念。形式参数是指定义成员方法时,括号里面的参数名字。实际参数是指在程序代码中调用成员方法时,传递给方法的参数。而对于参数值传递和引用传递的区分是令初学者头疼不已的一个问题。
  1 基本数据类型形式参数的值传递
  Java语言中基本类型包括:int,double等。当形式参数为基本类型时,程序采用单向值传递的形式,即将实际参数的值复制一份给形式参数,形式参数值的变化不影响原来的实际参数。示例如下:
  public class First{
  static int test(int x,int y){
  System.out.println("运算前形参:x="+x+" y="+y);
  x=x*2;//改变形参x的值
  y=y-1;//改变形参y的值
  System.out.println("运算后形参:x="+x+" y="+y);
  return x+y;
  }
  public static void main(String[] args){
  int a=4,b=5,c;
  System.out.println("运算前实参:a="+a+" b="+b);
  c=test(a,b);
  System.out.println("运算后实参:a="+a+" b="+b);
  }
  }
  运行结果如下:
  运算前实参:a=4 b=5;运算前形参:x=4 y=5
  运算后形参:x=8 y=4;运算后实参:a=4 b=5
  从结果可以看出,两个实际参数在运算前后都没有发生变化,而形式参数的值则发生了改变,说明基本类型参数是单向值传递。
  2 引用类型形式参数的引用传递
  程序中经常需要把一个对象作为实际参数进行传递,这和基本类型数据的值传递情况是不同的,因为此时传递的是对象的引用(地址)。当实参对象的引用(地址)被复制给形参时,对形参对象内容进行改变也就是对实参对象内容进行改变。例如:
  class Second{int v=0;}
  public class Third{
  static void test(Second x,int y){
  x.v=1;//改变形式参数对象x的成员变量值
  y=5;//改变形式参数基本类型(int)变量y的值
  }
  public static void main(String[] args){
  Second a=new Second();
  int b=4;
  System.out.println("运算前实参:a.v="+ a.v + " b="+b);
  test(a,b);
  System.out.println("运算后实参:a.v="+ a.v + " b="+b);
  }
  }
  运行结果如下:
  运算前实参:a.v=0 b=4;运算后实参:a.v=1 b=4
  从结果可以看出,当把对象作为方法的参数时,由于它传递的是对象的引用(地址),因此形式参数对象内容的改变会影响到实际参数,而基本类型没有影响。
  3 数组参数传递比较
  数组属于引用类型,它既可用来存放基本类型数据,又可以用来存放引用类型数据。从本质上说把数组作为参数传递,与引用类型参数传递是一致的。例如:
  public class Four{
  public static void test(int[] x,Second[] y){
  for(int i=0;i<3;i++)
  {x[i]++;y[i].v++;}
  }
  public static void main(String[] args){
  int[] a={1,2,3};
  Second[] b={new Second(),new Second(),new Second()};
  System.out.print("基本类型数组传递前元素的值:");
  for(int i=0;i<3;i++)
  System.out.print(a[i]+" ");
  System.out.println();
  System.out.print("引用类型数组传递前元素对象属性v的值:");
  for(int i=0;i<3;i++)
  System.out.print(b[i].v+" ");
  System.out.println();
  test(a,b);
  System.out.printl("基本类型数组传递后元素的值:");
  for(int i=0;i<3;i++)
  System.out.print(a[i]+" ");
  System.out.println();
  System.out.print("引用类型数组传递后元素对象属性v的值:");
  for(int i=0;i<3;i++)
  System.out.print(b[i].v+" ");
  System.out.println();
  }
  }
  运行结果如下:
  基本类型数组传递前元素的值:1 2 3。
  引用类型数组传递前元素对象属性v的值:0 0 0。
  基本类型数组传递后元素的值:2 3 4。
  引用类型数组传递后元素对象属性v的值:1 1 1。
  从结果我们可以看出,用数组作为参数传递可以改变实际参数的值。说明数组实现的是引用传递。
  4 总结
  通过比较可以看出:基本类型形参采用的是值传递,即复制实参数据,形参的改变不影响实参;而引用类型形参采用的是引用传递,即复制实参的引用地址,形参的改变实质上就是改变实参。开发者只有深入理解参数传递的本质,才能在程序开发中运用自如,提高代码质量。
  
  参考文献
  [1]张白一,崔尚森.面向对象程序设计——Java.西安电子科技大学出版社,2006.
  [2]王克宏.Java技术及其应用.高等教育出版社,1999.
其他文献
我们高中数学的教学目的是学生对数学知识更深层次掌握的同时,培养学生应用数学来解决实际问题的综合能力。数学是学习研究其他领域并能用于解决实际问题的工具,在高中教学的过
近日,全球人机交互解决方案的领先开发商Synaptics公司宣布,推出三款ClearPad系列独立式触控解决方案,这些最新解决方案的功能更加丰富,并增加了全新触控方式,包括面向智能手机、
在高中化学计算题中,经常会出现物质的量浓度的有关计算。这类计算题往往是很多同学的软肋,下面就来谈谈这类计算题的解题方法。其实,化学计算中常用的方法主要有以下几种。(
期刊
<正>对今天的欧洲城市来说,最切实的话题之一就是如何赋予建筑遗产以新生,并适应当代需求。这么说的原因在于,当遗产能够为新的主人所使用、照料和爱护,遗产保护工作总能更加
开展实验探究有利于学生快速掌握生物知识,抓住生物知识的本质,构建知识的框架结构,包括什么样的内涵与外延,以及是怎么发展的整个网络体系。然而,很多生物实验具有实验使用的动植物、微生物材料的时效性,需要我们不断地创新和改进。例如,我们以“观察植物细胞的质壁分离和复原”的实验为例,从假设“原生质层相当于一层半透膜”开始,既然假设原生质层是一层半透膜,那就可以完成渗透作用。所以其设计的大致步骤是:洋葱鳞片
近代史是中华民族的一部屈辱史,也是一部抗争史,更是一部探索史。近代史同时也是进行民族精神教育的最好、最生动的教材。本文从三个方面对近代史教育对民族精神培育起到的积
化学工艺流程题具有较强的实用性和综合性,是近几年高考化学命题的必考题型,不同的载体和新颖的题设情境体现了对考生能力和素质的考查,体现了命题者的创新,有较好的区分度。我认为要想答好化学工艺流程题,可以从以下几个方面入手。  一、牢记套路,一切尽在掌握之中  试题的载体、情境年年在变,而考查的知识点并没有发生变化,我把这些常用的方法和采取的措施做了一个总结,概括为“四个6”工程。  1.制备过程中原料
在如今实行“素质教育”的新形势下,要求全面培养学生的合作、竞争和创新能力是我国新课程标准的基本要求.本文就通过合作学习如何应用到高中数学课堂的实践做简要概述. Und
随着电子计算机的普及、办公自动化的深入发展,过去用纸墨、照相形成和传递的公文、图纸、图形、影像、文献资料、科技情报、商业信息等都可用电子计算机进行,由此产生了大量的