/*-- 例子 --*/public class Test {public static void main(String[] args) {Integer a = 1;Integer b = 2;System.out.println("a 和 b 的原始的值:"+a+" "+b);swap(a,b);System.out.println("a 和 b 的现在的值:"+a+" "+b);}private static void swap(Integer a, Integer b) {// TODO Auto-generated method stub}}  

Java 形参和实参的区别:

形参 :就是形式参数,用于定义方法的时候使用的参数,是用来接收调用者传递的参数的。 形参只有在方法被调用的时候,虚拟机才会分配内存单元,在方法调用结束之后便会释放所分配的内存单元。 因此,形参只在方法内部有效,所以针对引用对象的改动也无法影响到方法外。

实参 :就是实际参数,用于调用时传递给方法的参数。实参在传递给别的方法之前是要被预先赋值的。 在本例中 swap 方法 的numa, numb 就是形参,传递给 swap 方法的 a,b 就是实参

注意:在值传递调用过程中,只能把实参传递给形参,而不能把形参的值反向作用到实参上。在函数调用过程中,形参的值发生改变,而实参的值不会发生改变。而在引用传递调用的机制中,实际上是将实参引用的地址传递给了形参,所以任何发生在形参上的改变也会发生在实参变量上。

值传递和引用传递

JAVA的数据类型——分为两大类:基本类型 和 对象类型。相应的,变量也有两种类型:基本类型 和 引用类型。

基本类型的变量保存原始值,即它代表的值就是数值本身, 原始值一般对应在内存上的栈区;而引用类型的变量保存引用值,引用值指向内存空间的地址。代表了某个对象的引用,而不是对象本身。对象本身存放在这个引用值所表示的地址的位置。被引用的对象对应内存上的堆内存区。
基本类型包括: byte, short, int, long, char, float, double, boolean 这八大基本数据类型; 引用类型包括: 类类型接口类型数组。

变量的基本类型和引用类型的区别:基本数据类型在声明时系统就给它分配空间

int a;//虽然没有赋值,但声明的时候虚拟机就会 分配 4字节 的内存区域,//而引用数据类型不同,它声明时只给变量分配了引用空间,而不分配数据空间:    String str;//声明的时候没有分配数据空间,只有 4byte 的引用大小,//在栈区,而在堆内存区域没有任何分配str.length();//这个操作就会报错,因为堆内存上还没有分配内存区域,而 a = 1; 这个操作就不会报错。

值传递:方法调用时,实际参数把它的值传递给对应的形式参数,函数接收的是原始值的一个copy, 此时内存中存在两个相等的基本类型,即实际参数和形式参数,后面方法中的操作都是对形参这个值的修改,不影响实际参数的值。

引用传递:也称为地址传递、址传递。方法调用时,实际参数的引用(地址,而不是参数的值)被传递给方法中相对应的形式参数,函数接收的是原始值的内存地址在方法执行中,形参和实参内容相同,指向同一块内存地址,方法执行中对引用的操作将会影响到实际对象。

注意:类似的 String, Integer, Float, Double, Short, Byte, Long, Character等基本包装类型类。因为他们本身没有提供方法去改变内部的值,例如 Integer内部有一个 value 来记录 int基本类型的值,但是没有提供修改它的方法,而且 也是 final类型的,无法通过 常规手段更改。所以虽然他们是引用类型的,但是可以认为它是值传递,这个也只是认为,事实上还是引用传递、址传递。

代码完善:

private static void swap(Integer numa, Integer numb){int tmp = numa.intValue();try{ Field field = Integer.class.getDeclaredField("value");field.setAccessible(true);field.set(numa, numb);field.set(numb, new Integer(tmp));}catch(Exception e){e.printStackTrace();}
}

Integer的装箱操作,当给 Integer.value 赋值 int时,JVM 检测到 int不是Integer类型,需要装箱,才执行了Integer.valueOf()方法。而 field.set(numb,new Integer(tmp)) 设置的 是Integer类型了,就不会再拆箱后再装箱。

Java 形参和实参相关推荐

  1. java形参、实参、值传递、引用传递

    工作中,发现大多数人对值传递,引用传递理解不深,下面写一遍文章详细聊聊. 一.形参 形参:用来接收调用方法时传递的参数,只有在被调用时才分配内存,一旦调用结束,就释放内存空间.因此仅在方法内有效. p ...

  2. java形参和实参的三种传递方式(值传递,地址传递,引用传递)

    博客 博客 值传递:对形参的修改不会影响到实参 引用传递:对形参的修改会影响实参 一.值传递 在主函数中 #include <iostream> using namespace std;v ...

  3. java 形参和实参_Java——形参和实参的区别

    形参出现在函数定义中,在整个函数体内都可以使用,离开该函数则不能使用. 实参出现在主调函数中,进入被调函数后,实参变量也不能使用. 形参和实参的功能是作数据传送.发生函数调用时,主调函数把实参的值传送 ...

  4. java形参改变实参_java方法改变形参后得到实参值是否改变

    public voidtest1(){ String s= "1"; System.out.println("调用方法hange1前s的内存地址:"+Syste ...

  5. Java中的形参和实参的区别以及传值调用和传引用调用

    名词解析: 1.形参:用来接收调用该方法时传递的参数.只有在被调用的时候才分配内存空间,一旦调用结束,就释放内存空间.因此仅仅在方法内有效. 2.实参:传递给被调用方法的值,预先创建并赋予确定值. 3 ...

  6. Java形参的改变不会影响实参

    这篇文章就是想说一个结论,结论就是标题 -- Java形参的改变不会影响实参下面通过代码来理解这个结论. public class Main {public static void main(Stri ...

  7. 你真的了解JAVA的形参和实参吗?

    前几天在头条上看到一道经典面试题,引发了一些思考.也是写这篇文章的导火索. 背景 请看题: public class Main { public static void main(String[] a ...

  8. java中形参和实参的区别

    引用博客 引用博客 形参和实参的区别 形参 就是形式参数,用于定义方法的时候使用的参数,用来接收调用者传递的参数.形参只有在方法被调用的时候,虚拟机才会分配内存单元,在方法调用结束之后便会释放所分配的 ...

  9. java中实参和形参_java中形参和实参的区别

    实参和形参是程序设计语言中的通用概念,并不是只有C,C++有而JAVA没有.关于他们两者的区别你知道吗?下面是学习啦小编为大家准备的java中形参和实参的区别,希望大家喜欢! java中形参和实参的区 ...

最新文章

  1. 软件版本中 release stable alpha beta pre snapshot 区别
  2. 数据备份_天津数据备份工具多少钱
  3. Jquery控制select实现dataTables数据联动刷新
  4. 【9018:1956】线段树1
  5. python数据字典排序_Python自动处理数据字典(Python是3.6版本)
  6. SQL Server中的部分存储过程
  7. UVA10375 POJ2613 ZOJ1863 Choose and divide【组合计算+迭代】
  8. linux 停止正在执行的shell 程序
  9. java jackson 自定义_java – 自定义jackson解组行为
  10. HTML5七夕情人节表白网页制作【我喜欢你H5】HTML+CSS+JavaScript
  11. 【其他】Hexo博客(Next主题)放弃多说,接入网易云跟贴
  12. ftp服务器下载,细数五款好用的ftp服务器下载软件
  13. dell计算机的硬盘如何分区,戴尔电脑分盘怎么分区
  14. 在集体奋斗中实现自己的价值
  15. 太可怕了!给一个词就能模仿你的笔迹,Facebook这款神器不敢开源代码
  16. 斗鱼已公开的运维技术和架构分析
  17. pandas 选取行和列的方法
  18. 多模态深度学习综述:网络结构设计和模态融合方法汇总
  19. 关于 麒麟系统启动应用报错“undefined symbol: __cxa_throw_bad_array_new_length, version Qt_5“ 的解决方法
  20. 布袋除尘器过滤风速多少_袋式除尘器过滤风速一般多大

热门文章

  1. 光纤到桌面即FTTD综合布线方法
  2. 塞瓦维斯特定理(不定方程)
  3. node安装后的设置(node_global和node_cache) - windows
  4. SEO优化操作流程是怎样的
  5. #Java学习#实验考试题
  6. Android 实现禁用中文键盘
  7. Spring三大核心思想详解
  8. jQuery选择器之类选择器
  9. CF1367D 构造
  10. Dubbo之——Dubbo服务集群