Java中方法参数的值传递机制中的注意事项(字符串常量!!)
方法,必须由所在类或对象调用才有意义,若方法含有参数:
形参:方法生命时的参数
实参:方法调用时实际传给形参的参数值
Java中实参值如何传入方法呢?
Java里方法的参数传递方式只有一种:值传递。即将实际参数值得副本(复制品)传入方法内,而参数本身不受影响。
形参是基本数据类型:将实参基本数据类型变量的“数据值传递给形参”。
形参是引用数据类型:将实参应用数据类型变量的“地址值”传递给形参。
以上是基本值传递知识,适用于大部分的值传递问题。
但以下有一个贴别的引用数据类型,即字符串,它本身不违背上述的两条规则,但是新人极容易因为遵循了上述两条规则后产生错误
下面上代码。
public class ValueTransferTest {
public static void main(String[] args) {
String s1 = "hello";
ValueTransferTest test = new ValueTransferTest();
test.change(s1);
System.out.println(s1);
}
public void change(String s){
s = "hi~~";
}
输出结果为 hello
分析结果
因为字符串String是引用类型,所以是s1在占中收到的是“hello”的地址值,假设为0x8899,调用方法赋给形参s的也是地址值0x8899,他们都指向hello,那么s所指向的hello变成了hi~~,s1所指向的hello也应该变成hi ~~,但为什么依然不变呢,这不就不符合我们所熟悉的值传递机制了吗?
实际上,这并没有违背,s和s1确实指向的是同一个hello,他们得到的地址是一样的,都是ox8899,但是接下里修改的部分却不是在同一个hello上改的。
首先,我们从最开始的s1=’‘hello’'说起,这里这个字符串很特殊,它不是在堆中,而是在字符串常量池中,它用char[]型数组存储,那么数组不可修改,那么如果我非要改,那怎么改,那么只能新造一个char[]型数组,给它一个值hi~~,然后将这个hi~~的地址赋给栈中的局部变量s,如此一来,hello并没有变,那么原本指向hello的s1输出后任然是hello.