例题
public class test {
public static void main(String[] args) {
//1
String str1="abc";
char[]str2={'a','b','c'};
exChange1(str1,str2 );
System.out.println(str1);
System.out.println(new String(str2));
//2
StringBuffer sb1=new StringBuffer("A");
StringBuffer sb2=new StringBuffer("B");
exChange2(sb1,sb2 );
System.out.println(sb1.toString());
System.out.println(sb2.toString());
}
private static void exChange2(StringBuffer x,StringBuffer y){
x=y;
x.append(y);
}
private static void exChange1(String str1,char[]str2){
str1="gbc";
str2[0]='g';
}
}
运行结果:
abc
gbc
A
BB
定义:
值传递:方法调用时,实际参数把它的值传递给对应的形式参数,方法执行中形式参数值的改变不影响实际参数的值。
引用传递:也称为传地址。方法调用时,实际参数的引用(地址,而不是参数的值)被传递给方法中相对应的形式参数,在方法执行中,对形式参数的操作实际上就是对实际参数的操作,方法执行中形式参数值的改变将会影响实际参数的值。
a.传递值的数据类型:八种基本数据类型和String(这样理解可以,但是事实上String也是传递的地址,只是string对象和其他对象是不同的,string对象是不能被改变的,内容改变就会产生新对象。那么StringBuffer就可以了,但只是改变其内容。不能改变外部变量所指向的内存地址)。
b.传递地址值的数据类型:除String以外的所有复合数据类型,包括数组、类和接口
分析过程:
eg1:
string是值传递,方法 exchange1,对str1操作与最初定义的str1是无关的。str1的值不变,为abc;
数据是地址传递,更改了最初的str2[ 0 ]的地址所指向的值,str2[ 0 ]的值改变,g
eg2:
StringBuffer 是地址传递(只要不是八大基本数据类型和string,其他都是地址传递)。
(1)首先经过exchange2方法后,x指向sb1指向的内容,也就是A,y指向sb2指向的内容,也就是B
(2)然后,x=y,这时,x和y地址相同,值都为B
(3)最后x.append(y),这个语句执行后,意味着之前值为B的数据变为了BB。但是要注意的是,x和y是局部变量,他们的改变不影响外部的sb1和sb2。
下面是简要的示意图