Java方法的参数传递机制实例详解

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Java⽅法的参数传递机制实例详解
本⽂实例讲述了Java⽅法的参数传递机制。

分享给⼤家供⼤家参考,具体如下:
参数传递机制
对于程序设计语⾔来说,⼀般⽅法(函数)的参数传递有两种:按值传递和按引⽤传递。

按值传递意味着当将⼀个参数传递给⼀个⽅法时,⽅法接收的是原始值的⼀个副本。

因此,如果⽅法修改了该参数,仅改变副本,⽽原始值保持不变。

按引⽤传递意味着当将⼀个参数传递给⼀个⽅法时,⽅法接收的是原始值的内存地址,⽽不是值的副本。

因此,如果⽅法修改了该参数,调⽤代码中的原始值也随之改变。

需要注意的是,⽅法可以修改按引⽤传递的参数对应的变量值,但不可以修改按值传递的参数对应的变量值,这是两者的最⼤区别。

Java中的参数传递
Java中的参数传递机制只有⼀种,就是值传递。

在Java中并没有C++的引⽤传递这种参数传递机制,它所有的参数传递都遵循值传递的机制。

Java中对于对象(数组,类,接⼝)的传递似乎有点像引⽤传递,可以改变对象中某个属性的值。

但是不要被这个假象所蒙蔽,实际上这个传⼊⽅法的值是对象引⽤的拷贝,即传递的是引⽤的地址值,所以还是按值传递。

基本类型的参数传递
在⽅法调⽤时,传递的参数是按值的拷贝传递;
public class Test {
public static void main(String[] args) {
Test t = new Test();
int a = 5;
t.method(a); // 传递后,method⽅法对变量值的改变不影响这⾥的a
System.out.println("method调⽤完后的a: " + a);
}
private void method(int a){
System.out.println("method中重新赋值之前的a: " + a);
a = 10;
System.out.println("method中重新赋值之后的a: " + a);
}
}
执⾏结果如下:
method中重新赋值之前的a: 5
method中重新赋值之后的a: 10
method调⽤完后的a: 5
由此可知按值传递重要特点:传递的是值的拷贝,也就是说传递后就互不相关了。

下⾯看⼀下内存分析:
引⽤类型的参数传递
在⽅法调⽤时,传递的参数按引⽤进⾏传递,其实传递的引⽤的地址,也就是变量所对应的内存空间的地址。

public class Test {
public static void main(String[] args) {
Person person = new Person();
person.age = 18;
// 把main⽅法中的变量person所引⽤的内存空间地址,按引⽤传递给method⽅法中的person变量
// 请注意:这两个person变量是完全不同的,不要被名称相同所蒙蔽
method(person);
System.out.println("调⽤method⽅法之后:" + person.age);
}
public static void method(Person person){
person.age = 20;
System.out.println("method⽅法内第⼀次修改:" + person.age);
person = new Person(); // 新创建⼀个对象
person.age = 25;
System.out.println("method⽅法内第⼆次修改:" + person.age);
}
}
class Person {
public int age;
}
执⾏结果如下:
method⽅法内第⼀次修改:20
method⽅法内第⼆次修改:25
调⽤method⽅法之后:20
这⾥传递的是值的引⽤,也就是说传递前和传递后都指向同⼀个引⽤(也就是同⼀个内存空间)。

下⾯我们接着看⼀个例⼦:
public class Test {
public static void main(String[] args) {
int[] a = {5, 10};
method(a);
System.out.println("调⽤完method⽅法之后:" + a[0]);
}
public static void method(int[] a){
System.out.println("method内修改a[0]之前:" + a[0]);
a[0] = 50;
System.out.println("method内修改a[0]之后:" + a[0]);
}
}
执⾏结果如下:
method内修改a[0]之前:5
method内修改a[0]之后:50
调⽤完method⽅法之后:50
根据结果可知,调⽤method⽅法时实际传递的是引⽤的地址值。

传递String类型的参数
由于String类是final修饰的,不可变,它会在内存中在开辟⼀块新空间。

public class Test {
public static void main(String[] args) {
String str1 = new String("test1");
String str2 = "test2";
method(str1, str2);
System.out.println("调⽤method传参str1之后:" + str1 + ", " + str2);
}
public static void method(String str1, String str2){
System.out.println("method内修改str之前:" + str1 + ", " + str2);
str1 = "new1";
str2 = "new2";
System.out.println("method内修改str之后:" + str1 + ", " + str2);
}
}
执⾏结果如下:
method内修改str之前:test1, test2
method内修改str之后:new1, new2
调⽤method传参str1之后:test1, test2
总结:
1)基本数据类型传递的是值的复制,对⼀个参数的修改不会影响另⼀个参数;
2)引⽤类型传引⽤,形参和实参指向同⼀个内存地址(同⼀个对象),所以对参数的修改会影响到实际的对象;
3)String、Integer、Double等immutable的类型特殊处理,可以理解为传值,最后的操作不会修改实参对象(与基本数据类型⼀致)。

更多java相关内容感兴趣的读者可查看本站专题:《》、《》、《》、《》和《》
希望本⽂所述对⼤家java程序设计有所帮助。

相关文档
最新文档