大家对java方法的传参机制了解有多少,现在我给大家用代码和画图来讲解一下吧,请耐心看下去,会有不少的收获
基本数据类型的传参机制
<!--more-->
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); } }
运行结果
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方法并没有影响到主方法的值。这也是很重要的一个知识点。
基本数据类型,传递的时值拷贝,形参的任何改变不影响实参!!!
引用数据类型的传参机制
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(); } }
运行结果
test的arr数组 200 2 3 main的 arr数组 200 2 3
此时为什么在B方法中修改了数组,而main方法中也被修改呢
因为此时使用的是数组引用类型传递,main方法和test方法中的arr都指向了同一个地址,也就是同一个值,所以test的修改也会影响导main方法中的arr数组值。
引用类型传递的是地址(传递也是值,值是地址),可以通过形参影响到实参!
继续思考
想来大家现在已经理解了基础数据类型和引用类型的区别,那么再出一道题大家是否能答出来,或者知道为什么吗?代码如下
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应为多少?
运行结果
main 的 p.age= 10
大家有的人写错了这道题,很好奇为什么不是为null, C中不是执行了 p = null 吗,这里我给大家简单的画一下这张图。.
和大家想象的不一样,p = null 不是将对象的值改为null,而是将连向对象的线给断掉,所以此时不会改变main方法中的值。
在出一道类似的题,加强以下大家的对引用的认知,代码如下。
大家先思考在看答案。
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; } }
运行结果
main 的 p.age= 10
为何值还是没有改变,并没有指向null,而是改变了值啊。其实此时是因为 在C中创建了一个新的p对象,C修改的p的值也指向了堆中新的对象,而原来main的对象没有受到改变,所以输出的值自然不会改变。
到现在想来大家对基础和引用类型区别已经分清,如果还有问题,可以关注并私信我的公众号,我会一一解答。
如果有帮助到你的话,请关注我的公众号叭
公众号: 白都每天学java
个人博客 白都 (baidu2001.top)
CSDN 白.都