java的值传递机制以及递归

方法参数的值传递机制

如果变量是基本数据类型,其实赋值的是变量所保存的数据。
如果变量是引用数据类型,此时赋值的是变量所保存的地址。

package lei;

public class ValueTransTest {

	public static void main(String[] args) {
		// 基本数据类型
		int m = 10;
		int n = m;
		n = 20;
		System.out.println(m); // 还是10没变
	
		// 引用数据类型
		order o1 = new order();
		o1.orderid = 1001;
		order o2 = o1;   //此时o1和o2指向同一个地址
		System.out.println(" " + o1.orderid + o2.orderid);
	
		o2.orderid = 1002;
		System.out.println(" " + o1.orderid + o2.orderid); // 都变为1002了
	}
}

class order{
	int orderid;
}

方法的形参的值传递机制

  1. 形参:方法定义时,声明的小括号的参数
  2. 实参:方法调用时,实际传递给形参的值

考虑一下

package lei;

public class ValueTransTest2 {
	public static void main(String[] args) {
		int m = 10;
		int n = 20;
	
		ValueTransTest2 test = new ValueTransTest2();
		test.swap(m, n);
		System.out.println("m = " + m + "n = " + n);
	
	}


	public void swap(int m, int n){
		int temp = m;
		m = n;
		n = temp;
		System.out.println("m = " + m + "n = " + n);
	} 

}

在这里插入图片描述
为什么没有换成?,因为你m和n作为形参传递进swap函数时,他又会在栈里开辟一个新空间去存放要被swap函数执行的m和n,不是拿你主函数的m和n去执行swap。所以当你方法执行完销毁后,因为你没有return,那自然交换后的m和n也被销毁了。

在这里插入图片描述

所以有值传递机制

如果参数是基本数据类型,其实实参赋给形参的是真实的数据值(不是地址,会开辟一个新的地方)

如果参数是应用数据类型,那么实参赋给形参的就是地址,交换的话就相当于地址交换

package lei;

public class ValueTransTest3 {

	public static void main(String[] args) {
		Data data = new Data();
		data.m = 10 ;
		data.n = 20;
	
		ValueTransTest3 test = new ValueTransTest3();
		test.swap(data);
		System.out.println("m = " + data.m + "n = " + data.n );

	}
	public void swap(Data data){
		int temp = data.m;
		data.m = data.n;
		data.n = temp;
	}
}



class Data{	
	int m;
	int n;
}

在这里插入图片描述
引用数据类型为什么函数走完不会销毁,因为还有一个指针指向他呢,他就不是垃圾,就不会被销毁

下面看一个例子,可以更深刻一点
在这里插入图片描述
局部变量都是放在栈里面的,每new一次堆里就要多一个

一道网红题
int[] arr = new int[]{1,2,3};
char[] arr1 = new char[]{‘a’,'b','c'}
System.out.println(arr); // 地址
System.out.println(arr1) // abc

递归

一个方法调用他自身,就是递归
方法递归包含了一种隐式的循环,他会重复执行一段代码,但无须循环控制

如下例子,求1-100的和

package lei;

public class RecursionTest {

	public static void main(String[] args) {
	
		// 例子1 计算1-100之间所有自然数的和
		int sum = 0;
		for (int i = 1; i <=100; i++){
			sum += i;
		}
		System.out.println(sum);
	
		// 方式二 递归实现
		RecursionTest test = new RecursionTest();
		int sum1 = test.getSum(100);
		System.out.println(sum1);

	}


	public int getSum(int n){
		if (n == 1){
			return 1;
		}
		else{
			return n + getSum(n-1);
		}
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值