JAVA中String、StringBuffer和StringBuilder的形式参数问题

版权声明:本文为博主原创文章,未经博主允许不得转载。 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发生改变。

猜你喜欢

转载自blog.csdn.net/z249486888/article/details/83796170
今日推荐