0%

参数传递

前言:Java 参数传递是值传递还是引用传递?

概念

java基本数据类型(boolean,byte,char,String,int,Long,float,double)作为参数传递是值传递,即传的是值,无论在函数中怎么操作这个副本,实参的值是不会被改变的

java 对象是引用传递,传递是引用(不是这个对象!)

代码 1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class Main {
String string = new String("1234");
public static void main(String[] args) {
Main main = new Main();
main.setString1(main.string);
System.out.println(main.string);

main.setString2(main.string);
System.out.println(main.string);
}
public void setString1(String string){
string= new String("qwer");
}
public void setString2(String string){
this.string= new String("qwer");
}
}

结果

1
2
1234
qwer

分析

image-20200101224510911

如上图所以(有一点问题,因为String相对于其他对象有一些特殊,像题目中”1234”、”qwer”是会作为字符串常量存放在方法区中,堆中存放的应该是字符串常量的引用),新建一个Main对象,并用main引用指向它,注意,main是引用,不是对象,方法传递的参数是引用的拷贝不是对象,当这个引用变了,不影响对象,当然使用this.xxx,那就是修改引用而不是引用的拷贝了

代码 2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public class Main {
private Address address = new Address("江苏","南京");
public static void main(String[] args) {
Main main = new Main();
main.SetAddress1(main.address);
System.out.println(main.address.getCity());

main.SetAddress2(main.address);
System.out.println(main.address.getCity());

main.SetAddress3(main.address);
System.out.println(main.address.getCity());
}

public void SetAddress1(Address address){
address.setCity("苏州");
}
public void SetAddress2(Address address){
address = new Address("江苏","无锡");
}
public void SetAddress3(Address address){
this.address = new Address("江苏","南通");
}
}

结果

1
2
3
苏州
苏州
南通

分析

SetAddress1:

image-20200101224639578

SetAddress2:

image-20200101224650179

SetAddress3:

image-20200101224700157

-------------本文结束感谢您的阅读-------------