在实际的开发过程中,方法调用是一种很常见的操作,在方法调用中,关于参数的处理可能很多进行实际开发的程序员都不一定理解的很清楚,下面系统的介绍一下Java语言中参数传递的规则,以及和参数传递相关的一些问题。

和其它程序设计语言类似,Java语言的参数传递也分为两种:
1、 按值传递(by value)
适用范围:8种基本数据类型、String对象
特点:在内存中复制一份数据,把复制后的数据传递到方法内部
作用:在方法内部改变参数的值,外部数据不会跟着发生改变
2、 按址传递(by address)
适用范围:数组、除String以外的其他所有类型的对象
特点:将对象的地址传递到方法内部
作用:在方法内部修改对象的内容,外部数据也会跟着发生改变
基础示例代码:
Java代码
  1. public class Test1{
  2. public static void t1(int n){
  3. n = 10;
  4. }
  5. public static void t2(String s){
  6. s = "123";
  7. }
  8. public static void t3(int[] array){
  9. array[0] = 2;
  10. }
  11. public static void main(String[] args){
  12. int m = 5;
  13. t1(m);
  14. System.out.println(m);
  15. String s1 = "abc";
  16. t2(s1);
  17. System.out.println(s1);
  18. int[] arr = {1,2,3,4};
  19. t3(arr);
  20. System.out.println(arr[0]);
  21. }
  22. }
public class Test1{
public static void t1(int n){
n = 10;
}
public static void t2(String s){
s = "123";
}
public static void t3(int[] array){
array[0] = 2;
}
public static void main(String[] args){
int m = 5;
t1(m);
System.out.println(m);
String s1 = "abc";
t2(s1);
System.out.println(s1);
int[] arr = {1,2,3,4};
t3(arr);
System.out.println(arr[0]);
}
}
按照上面的参数传递规则,该代码的输出结果应该是:5 abc 2。因为int类型是按值传递,所以把参数m传递到方法t1时,相当于又复制了一份m的值,在方法t 1内部修改的是复制后的值,所以m的值不变,s1的输出和m类似。而arr是数组,属于按址传递,也就是把arr的地址传递到了方法t3内部,在方法t3内部修改数组中的值时,原来的内容也发生改变。
以上特性是Java语言中的规定,在语法上无法指定参数传递是按值传递还是按址传递,但是可以通过下面的变换实现:
1、 对于按值传递的参数,如果需要在方法调用以后修改参数的值,可以利用返回值来实现。
2、 对于按值传递的参数,如果需要在方法内部修改时原来的参数不改变,则可以在方法内部重新创建该对象实现。
示例代码如下:
Java代码
  1. public class Test2{
  2. public static int t1(int n){
  3. n = 10;
  4. return n;
  5. }
  6. public static String t2(String s){
  7. s = "123";
  8. return  s;
  9. }
  10. public static void t3(int[] array){
  11. //创建新的数组并赋值
  12. int[] newArray = new int[array.length];
  13. //数据拷贝
  14. System.arraycopy(array,0,newArray,0,array.length);
  15. newArray[0] = 2;
  16. }
  17. public static void main(String[] args){
  18. int m = 5;
  19. //重新赋值
  20. m = t1(m);
  21. System.out.println(m);
  22. String s1 = "abc";
  23. //重新赋值
  24. s1 = t2(s1);
  25. System.out.println(s1);
  26. int[] arr = {1,2,3,4};
  27. t3(arr);
  28. System.out.println(arr[0]);
  29. }
  30. }
public class Test2{
public static int t1(int n){
n = 10;
return n;
}
public static String t2(String s){
s = "123";
return  s;
}
public static void t3(int[] array){
//创建新的数组并赋值
int[] newArray = new int[array.length];
//数据拷贝
System.arraycopy(array,0,newArray,0,array.length);
newArray[0] = 2;
}
public static void main(String[] args){
int m = 5;
//重新赋值
m = t1(m);
System.out.println(m);
String s1 = "abc";
//重新赋值
s1 = t2(s1);
System.out.println(s1);
int[] arr = {1,2,3,4};
t3(arr);
System.out.println(arr[0]);
}
}
这样,程序的输出结果就将是:10 123 1。
在实际的程序开发中,可以根据需要使用类似的结构来进行实现。
下面再介绍一个参数传递的常见应用,利用参数传递实现返回值,这样的功能在IO类设计的read方法中大量使用。示例代码如下:
Java代码
  1. public class Test3{
  2. public static void initArray(int[] array){
  3. for(int i = 0;i < array.length;i++){
  4. array[i] = i;
  5. }
  6. }
  7. public static void main(String[] args){
  8. int[] a = new int[10];
  9. initArray(a);
  10. for(int i = 0;i < a.length;i++){
  11. System.out.println(a[i]);
  12. }
  13. }
  14. }
public class Test3{
public static void initArray(int[] array){
for(int i = 0;i < array.length;i++){
array[i] = i;
}
}
public static void main(String[] args){
int[] a = new int[10];
initArray(a);
for(int i = 0;i < a.length;i++){
System.out.println(a[i]);
}
}
}
在该示例代码中,在initArray方法内部修改了数组的值以后,外部数组a的值也会发生改变,间接实现了返回值的效果。当然,在该示例代码中,因为只返回一个参数,所以作用体现的不明显,如果需要返回多个参数时,使用按址传递是一种不错的主意。
因时间仓促,疏漏之处难免,请大家积极补充和指正。

【转载】Java语言中的参数传递相关推荐

  1. [转载]Java 语言中的函数编程

    Java 语言中的函数编程 如果您从事大型企业项目开发,您就会熟悉编写模块化代码的好处.良构的.模块化的代码更容易编写.调试.理解和重用.Java 开发人员的问题是,函数编程范型长期以来只是通过像 H ...

  2. [转载] Java 语言中的实例初始化块 ( IIB) 详解

    参考链接: Java中的实例初始化块(IIB) 在 Java 语言中的类初始化块 文章中我们简单的介绍了下 Java 中的实例初始化块 ( IIB ).不过我觉得介绍的有点简单了,于是,再写一篇文章详 ...

  3. java里的初始化块_[转载] Java 语言中的实例初始化块 ( IIB) 详解

    参考链接: Java中的实例初始化块(IIB) 在 Java 语言中的类初始化块 文章中我们简单的介绍了下 Java 中的实例初始化块 ( IIB ).不过我觉得介绍的有点简单了,于是,再写一篇文章详 ...

  4. C语言中函数参数传递

    C语言中函数参数传递的三种方式 (1)值传递,就是把你的变量的值传递给函数的形式参数,实际就是用变量的值来新生成一个形式参数,因而在函数里对形参的改变不会影响到函数外的变量的值. (2)地址传递,就是 ...

  5. Java语言中的-----访问修饰符

    day04 Java语言中的----访问修饰符 一.访问修饰符概述: 访问修饰符就是对变量或者是方法或者是类的一个修饰,通过修饰以后实现一些必要的权限,主要是说明类成员如何被使用的作用. 二.访问修饰 ...

  6. Java语言中的----数组

    day07  Java语言中的--数组 一.数组的概述: 什么是数组?数组是干什么用的?为啥要学数组?这些都是疑问.再你学完数组以后就知道了,数组是存储在相邻内存位置的单一数据类型的元素集合.什么是单 ...

  7. Java语言中几个常用的包

    Java语言中几个常用的包 Java采用包结构来组织和管理类和接口文件.本文介绍Java语言类库中几个常用的包,因为这几个包在软件开发与应用中经常需要用到,其中有些包是必要的.若是离开它,还真不能做事 ...

  8. java中的事件都继承自_下列说法中不正确的是()。A.Java语言中的事件都是继承自Java.awt.AW-TEvent类B.AWTEve...

    下列说法中不正确的是().A.Java语言中的事件都是继承自Java.awt.AW-TEvent类B.AWTEve 更多相关问题 [单选] 月经后期而至,量少,色淡,质清稀,少腹隐痛,喜暖喜按,脉沉迟 ...

  9. Java 语言中的函数编程

    Java 语言中的函数编程 利用闭包和高阶函数编写模块化的 Java 代码 如果您从事大型企业项目开发,您就会熟悉编写模块化代码的好处.良构的.模块化的代码更容易编写.调试.理解和重用.Java 开发 ...

最新文章

  1. mPaas-WKWebview网络拦截常见问题
  2. React相关资源推荐
  3. 数学建模算法:支持向量机_从零开始的算法:支持向量机
  4. java script创建对象_javascript笔记:深入分析javascript里对象的创建
  5. 在装有raid卡的服务器上安装Ubuntu
  6. c#中connect函数_Flink算子使用方法及实例演示:union和connect
  7. soap xml_SOAP XML消息–使用Liquid XML Studio进行了解和创建
  8. 监督学习、无监督学习、半监督学习、强化学习、自监督学习
  9. 这周学点变速不变调、变调不变速
  10. 论文阅读-2020ICRL-Neural execution of graph algorithms
  11. iPhone忘记访问限制密码的解决方案
  12. 转载---SQL Server XML基础学习之7--XML modify() 方法对 XML 数据中插入、更新或删除...
  13. Android小Demo——绘制小机器人
  14. 设备健康管理软件如何帮助企业优化设备维保计划?
  15. css3的vw单位,vh单位的讲解,以及vw vh的兼容性
  16. Bug敏感度与软件质量关系
  17. 杰理之蓝牙认证【篇】
  18. BUUCTF Rabbit
  19. Word另存为PDF时出现“错误!未找到引用源”的解决
  20. mysql marked crashed_MySQL解决is marked as crashed and should be repaired故障

热门文章

  1. 使用CDS view进行S4HANA的OData开发
  2. 母婴商城设置路由分发规则
  3. 【设计模式】之抽象工厂模式
  4. 16.控制转移指令(条件跳转指令、比较条件跳转指令、多条件分支跳转指令、无条件跳转指令)
  5. python tutorial什么意思中文_Python 2.7 Tutorial 中文版
  6. 37游戏叫板外国进口 用设计抢滩市场才是硬道理
  7. Unity 生成原始LUT用于外部校色相机不透明物体截图
  8. PCA参数,属性,接口列表
  9. win10自带搜索()带有括号或者特殊符号的方法
  10. OpenJudge NOI题库 1.7 编程基础之字符串