06.方法的传参机制
方法的传参机制对今后学习的编程非常重要!一定要的清清楚楚明明白白
基本数据类型的传参机制
public class MethodParameter01{
public static void main(String[] args){
//创建AA类,调用swap,并传入两个整数
int a = 10;
int b = 20;
CC cc = new CC();
cc.swap(a,b);
//调用完方法之后,在输出a与b的值
System.out.println("main方法的a="+a+"\nb="+b);
}
}
class CC{
public void swap(int a, int b){
System.out.println("a与b交互前的值:\na="+a+"b="+b);
//交换a与b的值
int temp = a;
a = b;
b = temp;
System.out.println("a与b交换完后的值\na=" + a + "\nb=" + b);
}
}
![[Pasted image 20221122210342.png]]
- 结论:
- 基本数据类型,传递的是值(值传递),形参的任何改变不影响实参。
引用数据类型的传参机制
案例:MethodParameter02.java
- 在D类中编写一个方法test100,接收一个数组,在方法中修改该数组,看看原来的数组是否有变化?
- D类中编写一个方法test200,可以接受一个Person(aegs,sa)对象,在方法中修改该对象属性,看看原来的对象是否有变化?
public class MethodParameter02 {
public static void main(String[] args) {
int[] arr = {1, 2, 3, 4, 5};
//调用D类的test100方法,并传入数组arr
D d = new D();
d.test100(arr);
System.out.println("\n调用完test100方法后的arr:");
for (int i : arr) {
System.out.print(i + "\t");
}
//创建对象p,并定义姓名与年龄
P p = new P();
p.name = "jack";
p.age = 10;
System.out.println("main方法传递给test200方法前的对象变量为:\n" + "姓名:" + p.name + "\n年龄:" + p.age);
//传递对象p的变量给D类的test200方法
d.test200(p);
System.out.println("main方法传递给test200方法后的对象变量为:\n" + "姓名:" + p.name + "\n年龄:" + p.age);
}
}
//定义P类
class P {
String name;
int age;
}
//定义D类,并定义test100与test200成员方法
class D {
//试验修改从main方法传递进来的数组有无改变
public void test100(int[] arrNew) {
System.out.println("main方法传入进来的数组:");
for (int i : arrNew) {
System.out.print(i + "\t");
}
//改变第三个元素的值
arrNew[2] = 100;
//打印
System.out.println("\nmain方法传入进来修改后的数组:");
for (int i : arrNew) {
System.out.print(i + "\t");
}
}
//试验修改从main方法传递进来的对象的成员变量有无改变
public void test200(P p) {
//修改mian方法对象P的属性初始值
p.name = "tom";
p.age = 20;
System.out.println("test200方法的对象变量为:\n" + "姓名:" + p.name + "\n年龄:" + p.age);
}
}
test100:
![[Pasted image 20221122214251.png]]
test200:
![[Pasted image 20221127210357.png]]
结论
- 引用类型传递的是地址(传递也是值,但是值是地址),可以通过形参影响实参。
案例:
-
下面方法会对原来的对象有影响吗?
p = nulll;
//不会。在test200方法中没有引用对象之后,在main方法使用不会有任何问题,因为是test的形参对象取消指向对象空间,而不是取消main方法的对象
![[Pasted image 20221127213154.png]]
p = new P();
//不会。当指向传递进来方法的对象值时,test200的对象p指向main方法的对象地址,然而这行代码却让对象p指向新建的对象地址,这跟数组指向另一个数值类似。所以此刻的对象p没有main方法对象p的任何数值,除非自己重新赋值。
返回main方法之后,在test200新创建的对象不使用的话将会被jvm判断为垃圾清理掉。
![[Pasted image 20221127213412.png]]
浙公网安备 33010602011771号