方法参数的值传递机制
如果变量是基本数据类型,其实赋值的是变量所保存的数据。
如果变量是引用数据类型,此时赋值的是变量所保存的地址。
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;
}
方法的形参的值传递机制
- 形参:方法定义时,声明的小括号的参数
- 实参:方法调用时,实际传递给形参的值
考虑一下
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);
}
}
}