关闭

String类型参数的传值问题

536人阅读 评论(0) 收藏 举报

public class TestString
{
public static void link(String a)
  {
  a+="word";
  }
  public static void main(String []args)
  {
  String a="hello";
  link(a);
  System.out.println(a);

  }
}

输出的是 hello ,不是hello word 

:这是个引用数据类型数据传递的问题(相当与我们常说的传引用调用),并非基本数据类型的参数传递(传值调用)。
public static void link(String a) 

  a+="word";         //语句2,把这个参数叫a2


String a="hello";    //语句1,把这个参数叫a1

语句1在执行的时候在堆中产生了一个"hello"对象,然后栈中引用变量指向a1指向"hello",在执行link(a)时将a1传给了a2,此时只是在栈中多了一个a2变量,堆中并没有新产生一个"hello"对象,即a1和a2指向的是同一个"hello",然后执行语句一a+="world";此时在堆中有产生了一个对象"helloworld",并将变量a2指向这个"helloworld",但a1仍然指向"hello",所以最后的打印结果是"hello"。这是由于String类型是一种特殊类型的引用类型,对String进行的任何修改,String都会新产生一个对象,存放修改后的String。可以比较一下下面的代码:

import java.util.*;
public class TestDYong {

public static void main(String[] args) {
StringBuffer str=new StringBuffer().append("hello");
change(str);
System.out.println(str);
}

public static void change(StringBuffer str){
str.append("world");
}

}

由于StringBuffer的append并不产生新的对象(区别与String的+产生新对象),所以上面代码打印的是"helloworld"
String类是final类。

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:241935次
    • 积分:2656
    • 等级:
    • 排名:第14151名
    • 原创:48篇
    • 转载:27篇
    • 译文:1篇
    • 评论:25条
    最新评论