总结如下:
/** * java的参数传递是值传递 * 如果参数是引用对象,传递的是引用对象的地址(副本),对副本修改,对象会被修改 * 如果是字符串变量,对参数修改不会修改参数。 * 如果是基本变量,传递的是基本变量的副本,不会修改参数 */
以下转载:https://blog.csdn.net/zhouww969/article/details/78302552
3、为什么string类型也是引用类型为什么函数调用没有改变外部的原型的值呢?
这主要是由于string内部保存值方式的原因 string是通过一个final char[]数组进行保存的 由于final类型的数组值不能够改变,所以在外部调用函数时将string地址的引用进行传递给函数的参数,函数内部再修改这个引用时,由于final char[] 不可修改,所以在再给变量赋值新值时都会重新创建一个string实例(这个新创建的string实例所指向的地址和外部string变量所指向的地址是不同的所以改变不了外部的变量)另外一个点说明因为final String 对象是不可变的,所以可以共享 也就是说 String op="abc" 和 String op1="abc" 指向的是同一个引用对象(字符串是常量;它们的值在创建之后不能更改---jdk Api)
附,代码:
/**
* java的参数传递是值传递
* 如果参数是引用对象,传递的是引用对象的地址(副本),对副本修改,对象会被修改
* 如果是字符串变量,对参数修改不会修改参数。
* 如果是基本变量,传递的是基本变量的副本,不会修改参数
*/
public class TestVariable
{
static String s="bbb";
static char[] a={'a','b','c'};
public static void main(String[] args) {
TestVariable t=new TestVariable();
t.change(s,a);
System.out.println(t.s+" "+new String(a));
String srt="aaa";
chageString(srt);
System.out.println(srt);
}
void change(String s,char[] a){
s="ok";
a[0]='g';
}
static void chageString(String a){
a="bbb";
}
}
输出结果:
bbb gbc
aaa