【JavaSE】成员方法传参机制
成员方法传参机制
1. 基本数据类型的传参机制
public class MethodParameter01 { public static void main(String[] args) { int a = 10; int b = 20; AA2 obj = new AA2(); obj.swap(a,b); System.out.println("main方法 a=" + a + "\tb=" + b); } } class AA2{ public void swap(int a,int b){ System.out.println("a和b交换前的值:" + "a=" + a + "\tb=" + b); int tmp = a; a = b; b = tmp; System.out.println("a和b交换后的值:" + "a=" + a + "\tb=" + b); } } 复制代码
内存分析法:
堆:一般存放基本数据类型(局部变量) 栈:存放对象(Cat cat,数组,引用数据类型等)
最后输出的
a,b
的值是在main
方法中,要找的是main方法中的a和b的值,而主函数中的a,b并没有发生交换,所以是a = 10,b = 20
swap方法中发生交换,但并不影响主方法中的交换,因为mian栈和swap是两个独立的空间,而且a、b都是基本数据类型,不是引用数据类型,所以不会影响到主方法中的a、b的值
2. 引用数据类型的传参机制
看一个案例 MethodParameter02.java
B 类中编写一个方法 test100,可以接收一个数组,在方法中修改该数组,看看原来的数组是否变化?答案:会变化
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(); } } 复制代码
内存分析法:
只要是调用一个方法就会产生一个新的栈
引用类型传递的是一个地址
B 类中编写一个方法 test200,可以接收一个 Person(age,sal)对象,在方法中修改该对象属性,看看原来的对象是否变化?答案:会变化
public class MethodParameter02 { //编写一个main方法 public static void main(String[] args) { //测试 BB b = new BB(); Person p = new Person(); p.name = "xdr630"; p.age = 22; b.test200(p); System.out.println("main 的 p.age=" + p.age); //10000 } } class Person{ String name; int age; } class B { public void test200(Person p){ person.age = 10000; } } 复制代码
结论
引用类型传递的是地址(传递也是值,但是值是地址),可以通过形参影响实参 3) 在看一个案例,下面的方法会对原来的对象有影响吗?
```java public class MethodParameter02 { //编写一个main方法 public static void main(String[] args) { //测试 BB b = new BB(); Person p = new Person(); p.name = "xdr630"; p.age = 22; b.test200(p); System.out.println("main 的 p.age=" + p.age); //10000 } } class Person{ String name; int age; } class B { public void test200(Person p){ p = null; } } 复制代码
对应示意图
作者:兮动人
链接:https://juejin.cn/post/7026375170763784223