java备忘录之方法传参

java的方法传参

java的方法传参中一般的说法是以两种方式进行传递,一种是值传递,一种是引用传递

产生上述说法的原因是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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
public class TestMethod {

public static void setValue(String str)
{
str = "new value";
System.out.println("setValue method:" + str);
}

public static void setReferenceValue(People p)
{
p.setName("new name");
System.out.println("setReferenceValue method:" + p.getName());
}
public static void swapReference(People p1,People p2)
{
People p = p1;
p1 = p2;
p2 = p;
System.out.println("swapReference method p1:" + p1.getName());
System.out.println("swapReference method p2:" + p2.getName());
}
public static void main(String[] args)
{
String name1 = "old name p1";
String name2 = "old name p2";
People p1 = new People(name1);
People p2 = new People(name2);

System.out.println("test method in value:");
System.out.println("before method:" + name1);
setValue(name1);
System.out.println("after method:" + name1);
System.out.println();

System.out.println("test method in reference:");
System.out.println("before method:" + p1.getName());
setReferenceValue(p1);
System.out.println("after method:" + p1.getName());
System.out.println();

System.out.println("test method swap reference:");
System.out.println("before p1 :" + p1.getName());
System.out.println("before p2 :" + p2.getName());
swapReference(p1,p2);
System.out.println("after p1 :" + p1.getName());
System.out.println("after p2 :" + p2.getName());

}
}
class People{

private String name;

public People(String name)
{
this.name = name;
}

public void setName(String name)
{
this.name = name;
}

public String getName()
{
return name;
}
}

输出结果为

1
2
3
4
test method in value:
before method:old name p1
setValue method:new value
after method:old name p1

方法中的值传递,java中基本类型和String都是值传递
因为String是不可变对象,对String的添加删除都是返回一个新的String对象
String的可变对象有StringBuffer和StringBuilder,StringBuffer是线程安全的,StringBuilder不是线程安全的

1
2
3
4
test method in reference:
before method:old name p1
setReferenceValue method:new name
after method:new name

方法中的引用传递,方法中可以改变引用对象的内容,因为引用拷贝后引用地址都是相同的。

1
2
3
4
5
6
7
test method swap reference:
before p1 :new name
before p2 :old name p2
swapReference method p1:old name p2
swapReference method p2:new name
after p1 :new name
after p2 :old name p2

方法中的引用传递,引用地址复制到方法参数后,如果方法参数改变引用地址,外部引用并不会随之改变

打赏

请我喝杯咖啡吧~

支付宝
微信