在Java中参数的传递主要有两种:值传递和参数传递;spa
下面是对两种传递方式在内存上的分析:code
一:值传递blog
解释:实参传递给形参的是值 形参和实参在内存上是两个独立的变量 对形参作任何修改不会影响实参内存
代码示例以下:class
package arrayDemo; public class Demo1 { public static void main(String[] args) { int b =20; change(b);// 实参 实际上的参数 System.out.println(b); } public static void change(int a){//形参 形式上的参数 a=100; } }
结果:20变量
为何?看下面分析:引用
通俗的讲法就是:形参只是实参建立的一个副本,副本改变了,本来固然不可能跟着改变;方法
再通俗的讲法就是:im
小明去餐厅吃饭,看见别人点的红烧肉挺好吃,九把服务员叫过来,说我要一份红烧肉,服务员从后厨拿来一份红烧肉,小明吃完了,可是他吃的红烧肉跟旁边那我的吃的是一份吗?固然不是。数据
再来解释引用传递
二:引用传递
实参传递给形参的是参数对于 堆内存上的引用地址 实参和 形参在内存上指向 了同一块区域 对形参的修改会影响实参
package arrayDemo; public class Demo1 { public static void main(String[] args) { int [] a={1,2,3}; System.out.println(a[0]); change(a); System.out.println(a[0]); } public static void change(int[] a ){ a[0]=100; } }
结果:1 100
为何?
因为引用传递,传递的是地址,方法改变的都是同一个地址中的值,
原来a[0]指向0x13地址,值是1,
后来在a[0] 指向的也是0x13地址,将值变成了100
因此,再查询a[0]的值的时候,值天然变成了100
通俗点的讲法就是:
小明回到家,他妻子说:冰箱二层有一只鸡,你去作了;
小明作好了,叫妻子过来吃饭。
这个时候,他妻子如今看见的鸡和她买回来的同样吗?
固然不同,都作熟了;
什么意思呢?
鸡就是数据
冰箱二层就是存储数据的地址
把鸡作熟了就是至关于把值改变了
地方仍是那个地方,就是鸡变了。