版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/z249486888/article/details/83796170
由于StringBuffer和StringBuilder只有安全性不同,因此本文中用StringBuilder代表StringBuffer和StringBuilder。
形式参数分为两种:1、基本数据类型 2、引用数据类型
1、方法调用时,实际参数将它的值传递给对应的形式参数,方法接收到的是原始值的副本,此时内存中存在两个相等的基本类型,若方法中对形参执行处理操作,并不会影响实际参数的值。
2、方法调用时,实际参数(指向的是地址而不是值)传递的是它的地址的值,方法接收到的是地址的值。因此当调用方法时,形式参数和实际参数指向的是同一个地址,因此改变形参的值,实际参数的值也会改变。
本文从两个方面入手:1、String作为参数 2、StringBuilder作形式参数
1、String作为参数
public static void main(String[] args) {
String s1="hello";
String s2="world";
System.out.println(s1+" "+s2);
Change(s1,s2);
System.out.println(s1+" "+s2);
}
public static void Change(String s1, String s2) {
// TODO Auto-generated method stub
s1=s2;
s2=s1+s2;
}
输出结果:
hello world
hello world
String为特殊的形式参数。String的值为常量,存放在常量池中,并且其值不会被改变,当change方法中引用形参时,会在常量池中产生新的值(形参s2指向的地址发生改变),而main方法中的s1和s2指向的地址的值不变,因此调用change方法不改变s1和s2的值。
String作形式参数时,效果与基本数据类型一样。
2、StringBuilder作形式参数时
public static void main(String[] args) {
StringBuilder S1=new StringBuilder("hello");
StringBuilder S2=new StringBuilder("world");
System.out.println(S1+" "+S2);
Change2(S1,S2);
System.out.println(S1+" "+S2);
}
public static void Change2(StringBuilder s1, StringBuilder s2) {
// TODO Auto-generated method stub
s1=s2;
s2.append(s1);
}
输出结果:
hello world
hello worldworld
S1和S2将地址传给形参s1和s2,调用Change2方法时,s1=s2,将s2的地址赋给s1,实际参数S1指向的地址的值没有改变。调用s2.append方法时改变了s2所指向地址对象的值,因此实际参数S2发生改变。