方法参数的传递机制(自学笔记)

方法参数的传递机制

int,string,Integer,arr[],类,传递参数的时候是怎样的一个方式的,期间变量会发生什么改变。让我们一起来研究研究。
还是通过代码的方式来了解。

public class Test1 {

	public static void main(String[] args) {
		int i = 1;
		String str = "hello";
		Integer num = 200;
		int[] arr = { 1, 2, 3, 4, 5 };
		MyData myData = new MyData();
		
		change(i, str, num, arr, myData);
		System.out.println("i="+i);
		System.out.println("str="+str);
		System.out.println("num="+num);
		System.out.println("arr="+arr[0]);
		System.out.println("myData="+myData.a);

	}

	public static void change(int j, String s, Integer n, int[] a, MyData m) {
		j += 1;
		s += "word";
		n += 1;
		a[0] += 1;
		m.a += 1;
	}
}

class MyData {
	int a = 1;
}

可以先思考最后的结果是什么再看结果,更方便理解。
在这里插入图片描述
和你设想的结果是否符合呢?不符合是为什么,符合了你又是怎么理解的呢?让我们一起来看看。
在这里插入图片描述
以上便是各个数据存储的方式,
int 类型直接存储在栈中,
String 类型存储在常量池里,
数组、integer和类中的常量存储在堆中。

在这里插入图片描述通过实参给形参赋值得到的结果,赋值时候并未发生太大变化。

其中形参是基本数据类型

  • 传递数据值

实参是应用数据类型

  • 传递地址值
  • 特殊的类型:String、包装类等对象不可变性

这时候逐渐运行计算代码
首先是j += 1;j的值等于J加上1,此时是栈内进行增加,
然后是s += "word";在常量池当中进行l hello 和world的相加生成了一个新的常量helloworld同时也有一个与之前不同的地址值,此时的s被赋予一个新的地址值指向helloworld.
n += 1;与s同理,只是其中的常量池变成了堆,堆中生成了一个新的值201,同时也被赋予一个新的地址值,n有了一个新的地址值指向201.
a[0] += 1;中的地址值指向的是数组a[0]的值,进行了增加,并未生成新的值。
m.a += 1;同样也是对堆中的int i=1进行了增加,但是并未改变原始的地址值。
具体可以看下图。
在这里插入图片描述再看看最后的输出语句。

System.out.println("i="+i);
System.out.println("str="+str);
System.out.println("num="+num);
System.out.println("arr="+arr[0]);
System.out.println("myData="+myData.a);

最后的 i 结果依然是 1 ;
str的地址值也并未发生改变,所以str的输出依然是hello;
num与str同理并未发生变化;
arr[0]已经改变了当前数组地址的值,所以结果变为了2
myData.a的值也已经发生改变。
故最后的结果为
i=1
str=hello
num=200
arr=2
myData=2

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值