成员方法传参机制
❤️一名热爱Java的大一学生,希望与各位大佬共同学习进步❤️
🧑个人主页:@周小末天天开心
各位大佬的点赞👍 收藏⭐ 关注✅,是本人学习的最大动力
感谢!
目录
前言
基本数据类型传参机制
引用数据类型传参机制
成员方法的返回类型
总结
前言
方法传参机制非常重要,一定要搞的明明白白。
基本数据类型传参机制
分析下面的案例,看看结果会输出什么。
public class MethodParameter01 {
public static void main(String[] args) {
int a = 10;
int b = 20;
//创建AA对象 名字 obj
AA obj = new AA();
obj.swap(a, b); //调用swap
System.out.println("main方法 a=" + a + " b=" + b);//a=10 b=20
}
}
class AA {
public void swap(int a,int b){
System.out.println("\na和b交换前的值\na=" + a + "\tb=" + b);//a=10 b=20
//完成了 a 和 b的交换
int tmp = a;
a = b;
b = tmp;
System.out.println("\na和b交换后的值\na=" + a + "\tb=" + b);//a=20 b=10
}
}
流程分析:
1)程序运行到 AA obj = new AA(); 时,会创建一个AA对象,名字为 obj。
2)调用AA对象中的swap方法,将 a = 10,b = 20,传给 swap 方法中的a和b。
3)在方法中,先输出了一遍a和b原本的值,然后进行了交换,此时在方法中a和b的值已经互换了。
4)在互换之后,又输出了一遍a和b的值,此时a = 20,b = 10。
5)方法执行完后,在main方法中又输出了一遍a和b的值,此时就要注意这里的a和b是多少。
6)这里的值a = 10,b = 20。这到底是为什么,看下面的输出结果以及内存图总结
内存流程分析图:
结论:基本数据类型,传递的是值,形参的任何改变不影响实参,所以在swap方法中交换了a和b的值,但不影响a和b在main方法中的值,也可以说,每个方法都在堆中对应一个自己的内存空间,不会互相影响。(注:sout表示输出语句)
输出结果:
引用数据类型传参机制
分析引用数据类型的传参案例,看看会输出什么
public class MethodParameter02 {
//编写一个main方法
public static void main(String[] args) {
B b = new B();
int[] arr = {1, 2, 3};
b.test100(arr);//调用方法
System.out.println(" main的 arr数组 ");
//遍历数组
for(int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + "\t");
}
System.out.println();
}
}
class B {
//B类中编写一个方法test100,
//可以接收一个数组,在方法中修改该数组,看看原来的数组是否变化
public void test100(int[] arr) {
arr[0] = 200;//修改元素
//遍历数组
System.out.println(" test100的 arr数组 ");
for(int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + "\t");
}
System.out.println();
}
}
查看输出结果,结合内存图分析程序运行流程:
可以看出,这里test100方法中的数组值和main方法中的数组值是一样的,可能有小伙伴就要问了,不是说两个方法指向不同的内存吗,为什么test100方法中更改数组值main方法中的也会改变?这里就要结合内存图分析。
流程分析:
1)给数组arr赋三个值 1, 2, 3,此时会在堆中新开一个地址来存放,也就是堆中0x0011的空间。
2)然后调用test100方法在方法中将arr数组的第一个地址对应的值改为200,也就是 arr[0] = 200。因为是数组引用传递,所以方法test100也会指向0x0011,而导致0x0011中的值也会进行更改。
3)然后在方法test100中遍历数组进行输出,因为此方法指向的内存空间0x0011的值已经进行了更改,所以会输出 200,2,3。
4)方法test100执行完成后,继续执行main方法,再次遍历输出一次arr数组。这里就要注意了,因为两个方法都指向了同一个数据空间,0x0011中的值已经更改,所以在main方法中输出arr数组的也会是 200,2,3。
成员方法的返回类型
分析下面的程序,思考成员方法的返回类型是什么
public class MethodExercise02 {
public static void main(String[] args) {
Person p = new Person();
p.name = "milan";
p.age = 100;
//创建tools
MyTools tools = new MyTools();
Person p2 = tools.copyPerson(p);
//到此 p 和 p2是Person对象,但是是两个独立的对象,属性相同
System.out.println("p的属性 age=" + p.age + " 名字=" + p.name);
System.out.println("p2的属性 age=" + p2.age + " 名字=" + p2.name);
//可以同对象比较看看是否为同一个对象
System.out.println(p == p2);//false
}
}
class Person {
String name;
int age;
}
class MyTools {
public Person copyPerson(Person p) {
//创建一个新的对象
Person p2 = new Person();
p2.name = p.name; //把原来对象的名字赋给p2.name
p2.age = p.age; //把原来对象的年龄赋给p2.age
return p2;
}
}
查看输出结果分析:
可以看出p 和 p2 的属性一样,但是两个对象却并不相等,这是因为它们的地址不同
流程分析:
1)首先创建p对象,给姓名和年龄两个属性赋值。
2)创建tools对象,调用copyPerson方法,将p的属性传给copyPerson方法中的p。
3)在copyPerson方法中创建一个 新的对象p2,将p的属性赋给p2,此时p和p2属性中的值相等。
4)返回p2对象,在main方法中用p2接收。
5)分别输出p和p2中的属性,可以看出p和p2中的属性完全相等,这说名这两个对象都指向了同一个内存空间。
6)再对p和p2对象进行比较,输出了一个false,说明p和p2对象的地址并不相同,因为p = p2是进行的地址比较。
得出结论:成员方法返回类型是引用类,而且只是指向了同一个内存空间,但是两个对象的地址并不相同。
总结
成员方法的传参机制对今后的学习非常重要,必须要多做练习且多加思考传参时内存中发生的变化。