您的位置:首页 > 编程语言 > Java开发

Java中的值传递和引用传递

2017-10-30 14:09 190 查看
值传递:实参把它的值传递给形参,形参只是用实参的值初始化一个临时的存储单元(即:实参和形参有着相同的值,但是存储单元不同),所以形参的值的改变不会引起实参的改变

引用传递:传递的对象的地址(可以把引用传递看做的是对象地址的值传递),这时因为形参和实参指向的是同一块存储单元,因此形参的值修改就会影响实参的值。

在Java语言中,原始数据类型在传递参数的时候都是按照值传递的,而包装类型在传递参数的时候是按引用传递

示例代码1

package Test_10;

public class Test {

int i=5;
public static void main(String[] args){
int i = 1;
StringBuffer s1 = new StringBuffer();
testPassParameter(s1,i);
System.out.println(s1);
System.out.println(1);
}

private static void testPassParameter(StringBuffer ss1, int n) {
ss1.append("World");//引用传递
n = 8;//值传递
}

}




运行结果

World

1

示例代码2:

package Test_10;

public class Test {

public static void main(String[] args){
Integer a = 1;
Integer b = a;//这里其实还是引用传递

//因为Integer是不可变类,b++的时候会创建一个新值为2的
//Integer赋值给b;此时a和b其实已经没有任何关系了
b++;
System.out.println(a);
System.out.println(b);
}
}


示例代码3

package Test_10;

public class Test {

public static void main(String[] args){
StringBuffer s1 = new StringBuffer("Hello");
StringBuffer s2 = new StringBuffer("Hello");
changeStringBuffer(s1,s2);
System.out.println(s1);
System.out.println(s2);
}

private static void changeStringBuffer(StringBuffer ss1, StringBuffer ss2) {
ss1.append("World");
ss2 = ss1;
}
}




运行结果:

HelloWorld

Hello

示例代码4:

package com.dong.test;
/**
* 值传递和引用传递
* @author msi
*
*/
public class Test {
String str = new String("tarene");
char[] ch={'a','b','c'};
public static void main(String[] args) {
Test test = new Test();
test.change(test.str,test.ch);//交换
System.out.println(test.str);
System.out.println(test.ch);
}
private void change(String str2, char[] ch2) {
str = "test ok";
ch[0] = 'g';
}

}


运行结果:

test ok

gbc

1.string类型的值是不可变的,为了考虑一些内存,安全等综合原因,把它设置成不可变的(不可变类)

2.方法echange接收的参数是引用的副本。即都是地址的复制值。

3.方法中str副本指向了一个新的字符串,但是并没有改变原本的str指向的字符串。

4.方法结束后,所有副本弹出结束,但是我们的成员变量str和ch还存在,它们依然是之前的地址。所以str的内容不变,ch第一个元素被改变。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息