一.基本数据类型的值交换
1.需求:定义一个函数交换两个基本类型变量的值;
2.实例:
import java.util.*;
class Demo1{
public static void main(String[] args){
int a = 3;
int b = 5;
System.out.println("交换之前的值:a = "+a+" b = "+b);
changeValue(a,b);
System.out.println("交换之后的值:a = "+a+" b = "+b);
}
public static void changeValue(int a,int b){
int temp = a;
a = b;
b = temp;
System.out.println("方法内部交换的值:a="+a+" b="+b);
}
}
3.结果:发现交换值前后没有变量的值发生变化。
4.原因分析
(1)首先有个堆内存和栈内存;
(2)main方法先运行,这时候JVM就会为main方法开辟一片属于main方法的内存空间,在这片main空间里声明一个变量a和一个变量b,然后调用changevalue方法,调用这个方法后把a和b传过去,这时候JVM会为changeValue开辟一片内存空间,这片空间是属于changeValue的;
(3)changeValue中有两个形参,这两个形参是属于局部变量,也就是说在这片空间里也有一个a和b,a和b作为形参,别人在调用这个方法的时候,是把这两个变量传给这两个形参,传递过来的是main方法中a和b所存储的值,也就是说传递给changeValue这片内存空间的a和b,传递过来的值是3和5,然后在changeValue这片内存空间中方法内部做了交换,此时在方法内部确实a变成了5,b变成了3;
(4)但是这个方法内部的a和b与main方法内部的a和b没有任何关系,因为形参之间是相互独立的,只是在changeValue这片内存空间中的a和b交换成功了,当changeValue方法结束之后,changeValue方法中的a和b变量也会同时消失,而main方法中的a和b并没有交换,因为它们之间没有相互关系。
二.数组中的值交换
1.需求:定义一个函数交换数组中两个元素的位置;
2.实例:
import java.util.*;
class Demo2{
public static void main(String[] args){
int[] arr = {23,10,9};
System.out.println("交换前数组的元素是:"+Arrays.toString(arr));
changeArr(arr,1,2);
System.out.println("交换后数组的元素是:"+Arrays.toString(arr));
}
public static void changeArr(int[] arr,int index1,int index2){
int temp = arr[index1];
arr[index1] = arr[index2];
arr[index2] = temp;
}
}
3.结果:交换值成功;
4.原因分析:
(1)首先仍然是一片栈内存,一片堆内存;
(2)main方法先运行,JVM会先开辟一块空间是属于main方法的,先声明一个变量,然后在堆内存中创建一个数组对象,长度为3,存储的值分别是23,10,9,假设它的内存地址是0X98,此时arr记录的就是0X98,arr指向这个对象;
(3)然后在main方法中调用了changeArr(arr,1,2),把arr和1和2传递过去,这时JVM也会为changeArr开辟一片属于它的内存空间,而在changeArr中有三个形参分别接收了arr(地址),此时changeArr中的arr也是指向0X98,里面的arr也是指向了刚才的一个对象,现在两片内存空间的arr不是同一个变量,只是指向了同一个对象,所以在这个方法的内部做了一些交换值;
(4)因为changeArr方法内部是对arr进行操作,因为这片空间中的arr也指向了这个对象,所以对这个对象进行了操作,把对象中的两个位置的值做了交换,交换完成以后changeArr这片内存空间也消失了。紧接着在主方法中输出arr的这个元素,arr指向了那个对象,但是这个对象的数据已经被刚才的那个局部变量给改变了。所以出现的就是9和10,而不是10和9。
三.对象的值交换
1.实例
import java.util.*;
class Person{
int x = 10;
}
class Demo3{
public static void main(String[] args){
Person p = new Person();
changeObj(p,20);
System.out.println("x = "+p.x);
}
public static void changeObj(Person p,int x){
p.x = x;
}
}
2.运行结果
3.内存分析: