0%

Java方法传参机制

大家对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应为多少?

运行结果

1
main 的 p.age= 10

大家有的人写错了这道题,很好奇为什么不是为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;
}
}


运行结果

1
main 的 p.age= 10

为何值还是没有改变,并没有指向null,而是改变了值啊。其实此时是因为 在C中创建了一个新的p对象,C修改的p的值也指向了堆中新的对象,而原来main的对象没有受到改变,所以输出的值自然不会改变。

到现在想来大家对基础和引用类型区别已经分清,如果还有问题,可以关注并私信我的公众号,我会一一解答。

如果有帮助到你的话,请关注我的公众号叭

个人博客 白都 (baidu2001.top)

CSDN 白.都

有帮助的话可以来打赏一些或者经常来看看我哦,我在这里等你!