Java参数的传递到底是以什么方式进行的,这个问题比较让我困扰。

有人说Java只有按值传递,但这种解释太过含糊,对于基本类型完全适用,但牵扯到对象,解决不了实际问题。

前几日,看到一篇英文文章,对这个事情解释的很清楚,转过来,顺便翻译一下。

===========我是分割线==========

Java通过对象的引用来操纵对象,并且对象的所有变量也是引用。但是,Java参数的传递不是通过引用传递的,而是通过值传递。

以交换函数badSwap()为例:

Java代码

public void badSwap(int var1, int var2)

{

int temp = var1;

var1 = var2;

var2 = temp;

}

当badSwap()返回时,作为参数传递进出的两个变量仍保持原来的值。如果把参数类型由int换成Object,方法仍然无效,因此得出Object也是按照值进行传递而非引用。下面就解释其微妙之处。

Java代码

public void tricky(Point arg1, Point arg2)

{

arg1.x = 100;

arg1.y = 100;

Point temp = arg1;

arg1 = arg2;

arg2 = temp;

}

public static void main(String [] args)

{

Point pnt1 = new Point(0,0);

Point pnt2 = new Point(0,0);

System.out.println("X: " + pnt1.x + " Y: " +pnt1.y);

System.out.println("X: " + pnt2.x + " Y: " +pnt2.y);

System.out.println(" ");

tricky(pnt1,pnt2);

System.out.println("X: " + pnt1.x + " Y:" + pnt1.y);

System.out.println("X: " + pnt2.x + " Y: " +pnt2.y);

}

执行main()函数,我们将看到以下结果:

Java代码

X: 0 Y: 0

X: 0 Y: 0

X: 100 Y: 100

X: 0 Y: 0

方法成功改写了ptn1的值, 但是pnt2和pnt1没有成功交换。这就是困扰的主要原因。在main()函数中,pnt1和pnt2仅仅是对象的引用,当你把pnt1和pnt2作为参数传递给tricky()方法时,Java就把这个引用像传递其他参数一样,按照值进行传递,这意味着传递给函数的参数是原引用(original reference)的一个新副本(method reference)。图1就展示了,当Java把参数传递给函数后,这两个引用指向同一个对象。

图1:当Java把参数传递给函数后,这两个引用指向同一个对象

Java复制并按值传递引用,而非对象本身。因此,原引用指向原对象时,方法就能改变原对象的值。如果引用仅是一个副本,则交换函数失效。如图2所示引用的副本进行了交换,而非原引用。方法被调用后,得到的是没有进行交换的原引用。可以在函数体外对原引用进行交换,以实现成功的交换。

图2:引用的副本进行了交换,而非原引用

java参数的传递方式有_Java参数的传递方式。相关推荐

  1. java 传入参数_java参数怎么传递参数

    计算机语言给子程序传递参数的方法有两种: 按值传递(call-by-value):这种方法将一个参数值复制成子程序的正式参数.这样,对子程序的参数的改变不影响调用它的参数. 引用调用(call-by- ...

  2. java中方法的命名_Java方法中的参数太多,第5部分:方法命名

    java中方法的命名 在上一篇文章 (有关处理Java方法中过多参数的系列文章的 第4部分 )中,我将方法重载视为一种向客户提供需要较少参数的版本的方法或构造函数的方法. 我描述了该方法的一些缺点,并 ...

  3. java 变参 使用数组调用_java中的可变参数使用方法

    java中的可变参数使用方法 可变参数时Java 1.5新增的方法,可变参数方法接收0个或者多个指定类型的参数,可变参数机制通过先创建一个数组,数组的大小为在调用位置所传递的参数数量,然后将参数值传到 ...

  4. java中注解动态传参_Java自定义注解源码+原理解释(使用Java自定义注解校验bean传入参数合法性)...

    Java自定义注解源码+原理解释(使用Java自定义注解校验bean传入参数合法性)java 前言:因为前段时间忙于写接口,在接口中须要作不少的参数校验,本着简洁.高效的原则,便写了这个小工具供本身使 ...

  5. java heap space 什么意思_java heap space解决方法和JVM参数设置

    因为程序要从数据读取近10W行记录处理,当读到9W的时候就出现 java.lang.OutOfMemoryError: Java heap space 这样的错误. 在网上一查可能是JAVA的堆栈设置 ...

  6. java 11:数组作为函数参数,数组做为函数返回值

    1 数组作为参数 我们可以将数组作为参数,传入到函数中,其实就像我们main函数中 public void main(String [] args){};就是用数组作为函数参数: 又如, [java] ...

  7. Java编程技巧:如何实现参数的输入输出?

    简介:Java没有直接的输入输出参数机制,无法简单地实现参数的输入输出功能,因此需要借助其它方法来实现.本文作者通过实践总结,分享利用方法参数.方法返回值.类字段等方法来实现参数的输入输出,并对比总结 ...

  8. js中的if与Java中的if_JS直接if参数的用法JS中!和!!区别

    经常在JS中见一些代码直接if(参数),然后参数调用的时候是将元素自己传下去.例如下面代码: functiontest1(obj){if(obj){ alert($(obj).val()); }els ...

  9. 【Java】Eclipse输入命令行参数的方法

    首先需要说明的是String[] args是一个Java命令行参数的数组,这些参数一般是在命令行输入,可以被main方法直接使用. 请看下面这个类 public class Test {public ...

最新文章

  1. 手机游戏繁荣时代,团队的N条死路
  2. 2009年北京突然的一场雪
  3. ASA IPSEC ***配置
  4. SPI通信总线-51
  5. 我的世界1.13的服务器网站,我的世界1.13纯净版
  6. 删除一行下方单元格上移_快速删除Excel工作表多余空单元格
  7. 指针笔试题及其解析、字符串左旋、字符串追加strcat
  8. 假如我来发明编程语言
  9. 斯坦福教授ICLR演讲:图网络最新进展GraphRNN和GCPN(附PPT下载)
  10. 暴风影音皮肤_暴风影音16周年纪念版 v9.04
  11. STM32固件库下载步骤
  12. Java面试图片找规律,校招 - 行业测评题、图形推理题、逻辑思维面试题,解题技巧汇总...
  13. 数理统计SPSS软件实验报告一--描述性统计
  14. 计算机图形学入门(十二)-阴影映射Shadow mapping(为光线追踪准备)
  15. ES文件浏览器ftp文件共享,通过电脑访问手机文件夹传输文件
  16. HDU-6357Hills And Valleys(用最长可重复公共子序列求最长非递减子序列)
  17. Oracle:经典例题解析
  18. 安装PHPStudy(小皮)V8.1最详细安装教程
  19. MOS管-传输特性曲线的细微之处
  20. Java编程语言介绍

热门文章

  1. Android手机管理平台搭建:STF和atxserver2
  2. 逻辑斯蒂回归以及它的梯度下降法
  3. 三星如何挣脱诺基亚魔咒?
  4. linux 安装 godoc
  5. 【极客大挑战 2019】BuyFlag
  6. GBDT + LR模型融合
  7. 认可不断!知道创宇荣获 CSA 2021 安全创新奖
  8. c语言怎样调取网卡信息,求C语言编程实现获取网卡地址
  9. 1px像素问题(二):解决方法
  10. pycharm下debug详解