大家对java方法的传参机制了解有多少,现在我给大家用代码和画图来讲解一下吧,请耐心看下去,会有不少的收获
基本数据类型的传参机制
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| public class Method { public static void main(String[] args) {
int a = 10; int b = 20;
A obj = new A(); obj.swap(a, b);
System.out.println("\nmain方法\na=" + a + "\nb=" + b); }
} class A { public void swap(int a, int b){ System.out.println("\na和b交换前的值\na=" + a + "\nb=" + b);
int tmp = a; a = b; b = tmp; System.out.println("\na和b交换后的值\na=" + a + "\nb=" + b);
} }
|
运行结果
1 2 3 4 5 6 7 8 9 10 11 12
| a和b交换前的值 a=10 b=20
a和b交换后的值 a=20 b=10
main方法 a=10 b=20
|
同学们想一想为什么a与b在进行交换以后在main方法中依旧是原来的顺序。
这里给大家画个图
在调用swap时就会开启swap栈,在swap使用结束后swap栈也会被销毁,而此时main方法中的a 和 b还是原先的ab,也就是说swap方法并没有影响到主方法的值。这也是很重要的一个知识点。
基本数据类型,传递的时值拷贝,形参的任何改变不影响实参!!!
引用数据类型的传参机制
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| public class Method2 { public static void main(String[] args) {
B b = new B(); int[] arr = {1, 2, 3}; b.test(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 { public void test(int[] arr){ arr[0] = 200;
System.out.println("test的arr数组");
for(int i = 0; i < arr.length; i++) { System.out.print(arr[i] + "\t"); } System.out.println(); } }
|
运行结果
1 2 3 4
| test的arr数组 200 2 3 main的 arr数组 200 2 3
|
此时为什么在B方法中修改了数组,而main方法中也被修改呢
因为此时使用的是数组引用类型传递,main方法和test方法中的arr都指向了同一个地址,也就是同一个值,所以test的修改也会影响导main方法中的arr数组值。
引用类型传递的是地址(传递也是值,值是地址),可以通过形参影响到实参!
继续思考
想来大家现在已经理解了基础数据类型和引用类型的区别,那么再出一道题大家是否能答出来,或者知道为什么吗?代码如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| public class Method3 { public static void main(String[] args) {
C c = new C();
Person p = new Person(); p.age = 10; p.name = "白都";
c.test(p); System.out.println("main 的 p.age= " + p.age);
}
} class Person { String name; int age; } class C { public void test(Person p) { p = null; } }
|
大家想想此时main输出的age应为多少?
运行结果
大家有的人写错了这道题,很好奇为什么不是为null, C中不是执行了 p = null 吗,这里我给大家简单的画一下这张图。
和大家想象的不一样,p = null 不是将对象的值改为null,而是将连向对象的线给断掉,所以此时不会改变main方法中的值。
在出一道类似的题,加强以下大家的对引用的认知,代码如下。
大家先思考在看答案。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| public class Method3 { public static void main(String[] args) {
C c = new C();
Person p = new Person(); p.age = 10; p.name = "白都";
c.test(p); System.out.println("main 的 p.age= " + p.age);
}
} class Person { String name; int age; } class C { public void test(Person p) { p = new Person(); p.name = "tom"; p.age = 99; } }
|
运行结果
为何值还是没有改变,并没有指向null,而是改变了值啊。其实此时是因为 在C中创建了一个新的p对象,C修改的p的值也指向了堆中新的对象,而原来main的对象没有受到改变,所以输出的值自然不会改变。
到现在想来大家对基础和引用类型区别已经分清,如果还有问题,可以关注并私信我的公众号,我会一一解答。
如果有帮助到你的话,请关注我的公众号叭
CSDN 白.都