成员方法传参机制
-
基本数据类型的传参机制
-
结论: 基本数据类型, 传递的是值(值拷贝) , 形参的任何改变不影响实参
package Hsp;
public class Method {
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);
}
}class AA{
public void swap (int a,int b){
System.out.println("
a和b交换前的值
a=" + a + " b=" + b);
//完成了a和b的交换
int tmp = a;
a = b;
b = tmp;
System.out.println("
a和b交换后的值
a=" + a + " b=" + b);
}
} -
内存分析法:
-
堆 : 一般存放基本数据类型(局部变量)
-
栈 : 存放对象(Cat cat,数组,引用数据类型等)
-
最后输出的 a,b的值是在main方法中,要找的是main方法中的a和b的值,而主函数中的a,b并没有发生交换,所以是 a = 10,b = 20
-
swap方法中发生交换,但并不影响主方法中的交换,因为mian栈和swap是两个独立的空间,而且a、b都是基本数据类型,不是引用数据类型,所以不会影响到主方法中的a、b的值
-
-
引用数据类型的传参机制
-
B 类中编写一个方法 test100,可以接收一个数组,在方法中修改该数组,看看原来的数组是否变化?
答案:会变化
public class M2 { 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] + " "); } 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] + " "); } System.out.println(); } }
-
内存分析法:
-
只要是调用一个方法就会产生一个新的栈
-
引用类型传递的是一个地址
-
B 类中编写一个方法 test200,可以接收一个 Person(age,sal)对象,在方法中修改该对象属性,看看原来的对象是否变化?答案:会变化
public class MethodParameter02 { 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; } }
-
结论:引用类型传递的是地址(传递也是值,但是值是地址),可以通过形参影响实参
public class Method02 { 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; } }
-
对应示意图
-
-