class C{
public static void main(String args[])
{
String str="hello";
change(str);
System.out.println(str);
}
static String change(String str)
{
return str="helloaa";
}
}
为什么输出的是hello??哪位大虾帮帮忙了

解决方案 »

  1.   


    class C {
      public static void main(String args[]) {
        String str = "hello";
        str = change(str); //改了这一行
        System.out.println(str);
      }  static String change(String str) {
        return str = "helloaa";
      }
    }
      

  2.   

    谢谢!我不是要“helloaa”这个结果,我是想知道为什么那样会输出“hello”
      

  3.   

    你要弄明白局部变量和全局变量的关系
    static String change(String str) {
        return str = "helloaa";
      }
    中的str是一个局部变量,只在这个方法中有效,出了这个方法就无效了
    而且你的这个str变量实际上是对前面定义的那个全局变量的一个拷贝,而不是一个引用,它的改变是不会影响到全局的那个Str
      

  4.   

    String 是不允许改变的,任何改变都会生成一个新的对象,这个是String的特殊性
    普通的类,传过去,修改了,原来的也会跟着改的!String不行,只能向1楼那样,把新变化的对象返回来,赋值给以前的变量
      

  5.   

    static   String   change(String   str)
    {
    return   str="helloaa";

    这个str的作用域只是这个方法本身。change中的str和main中的str不是一块内存。
      

  6.   

    比如,下面的程序输出是什么呢??public class Test {
      public static void main(String... args) {
        TT tt = new TT();
        tt.str = "hellp";
        change(tt);
        System.out.println(tt.str);
      }  static TT change(TT tt) {
        tt.str = "helloaa";
        return tt;
      }
    }class TT {
      public String str;
    }
      

  7.   

    这个问题昨天好像还有人问过,那个人好像是把一个Integer ++,结果怎么也加不了,其实一样的道理,包装类和String都是不变的,你要变就要让他指向新的值
      

  8.   

    启动一个Java程序,则会产生一个虚拟机实例,然后通过类装载器子系统来加载一个class文件,把class文件得到的信息装载到“运行时数据区”,虚拟机的“运行时数据区”包括:方法区,堆,Java栈,PC寄存器(注意这里是PC寄存器,Java虚拟机本身是基于栈的结构,Stack-based,PC寄存器主要用来指示下一条被执行的指令),本地方法栈。通过虚拟机内部执行引擎,执行包含被装载类的方法中的指令,也可能会调用本地方法接口,与操作系统本地方法库进行交互。这是一个java程序运行的全部过程。方法区用来存放从class文件中解析得到的类型信息,而程序中运行时创建的对象都放到堆中,PC寄存器的作用上面已经说过,本地方法栈存储本地方法调用的状态,Java栈存储Java方法中调用的状态,包括布局变量,被调用时传进来的参数,它的返回值,以及运算的中间结果等等。主要谈一谈Java栈,Java栈由许多栈帧(stack frame)或者说帧(frame)组成d ,与flash中帧的概念相似,一个栈帧包含一个Java方法调用的状态。当线程调用一个Java方法时,虚拟机压入一个新的栈帧到该线程的Java栈中,当该方法返回时,这个栈帧将被弹出并抛弃。main()方法调用change()方法,str的值在change()方法中的值是"helloaa",但是当此方法返回后,它的值将不存在了,因为在main()中没有把它的值赋予一个变量,这一句相当于没有执行一样。
      

  9.   

    String的形参是实参的一个copy且String本身是final的 
    不同于StringBuffer 虽然也是传值调用 但它的值本身是一个引用
    同一个引用指向的是同一个对象
    class Test {
    public static void main(String args[]) {
    StringBuffer str = new StringBuffer("hello");
    change(str);
    System.out.println(str);
    } static StringBuffer change(StringBuffer str) {
    return str.append("oaa");
    }
    }/*
    hellooaa
    */
      

  10.   

    个人认为这题的解答不应该是“String是不可变类”,而是方法调用中JAVA的传值。所传的值无论是基本类型还是引用类型都不会改变,能改变的只是引用指向的对象状态。
      

  11.   

    对于基本类型和String而言,java是传值不是传引用,也就是说当你把"hello"传给方法的时候,不是把"hello"这个字符串的地址穿过去,而是把"hello"字符穿过去,所以根本就不会改变str的值。其他类型而言,比如穿对象的时候,java就是穿引用了,情况刚好就跟前者相反
      

  12.   

    废话不多,转过去的只有是"hello",不是引用,假如是的话,str能不该变吗?
    这样说比楼上面的朋友清楚多了。至少一个小问题不会东拉西拉,拉了又牛头不对马口。
    别犹豫了,给分!
    楼上说的String声明为final ????你回去多看点书,不要误导他人啊!!!
      

  13.   

    class   C{
    public   static   void   main(String   args[])
    {
    String   str="hello";
    change(str);
    System.out.println(str);
    }
    static   String   change(String   str)
    {
      11StringBuffer str;
       
         str="helloaa";
         str.append(str);
        return str.toString();
    }
      

  14.   

    str 并没有被重新赋值当然还是hello
      

  15.   

    回12楼:
    楼上有人说String 声明为final 了吗?别说你把不可变类当做final了吧,String的确是不可变类啊.回楼主:
    Java中关于方法的参数传递
    基本数据类型,String类和包装类,传递的是值.
    类对象传递的才是引用.如果你把String改为StringBuffer结果就不一样了.
      

  16.   

    不过依然需要指出,String确实是final的....
      

  17.   

    回复楼上的爷们,也就是楼号为18-20个爷们:
    final声名一个变量,则这个变量的内容不能改变,然而如下:
    String s=new String("爷们你们好");
    s值是一个地址值对把,
    然而我们可以改变s的值,比如在:
    String s=new String("爷们你们好");
    s=new String("娘们你们好");
    很可以的看见,s的值改变了,然而,与---final声名一个变量,脾并且不能改变值相互矛盾!
    所以,很明显!不是声明为final!!
    而上面上面的"爷们你们好"这个是一个字符常量,常量,顾名思义,不能改变!
    StringBuffer,就不说拉,API...:)
      

  18.   

    插句嘴·~
    6楼老紫竹的输出是什么
    helloaa 吗
      

  19.   

    我从别的地方找的
    觉得说的很清楚:string是引用类型,但它也有一些值类型的特征。 String传值还是传引用 
    C#的String声明是class String,当然是传引用。 
    不过,之所以有这个疑惑,多数是因为这个情况: 
    string a = "aaa"; 
    string b = a; 
    b = "bbb"; 
    或者是这么几行代码: 
    public void Swap(string s1, string s2) 

    string temp=s1; 
    s1=s2; 
    s2=temp; 

    这时候结果一打印,结果发现a的值还没有变,Swap也没有成功,这时候就会有幻觉:是不是没有传引用啊? 
    呵呵,string不会这么粗暴的打乱“声明为class就是传引用”这种规则的。 
    分析一下: 
    string a = "aaa"; //==> a----->new String("aaa") 
    string b = a; //==> b----->a, 传引用 
    b = "bbb"; //==> b----->new String("bbb"), 传引用,b指向了一个新的字符串,a并没有变。 Swap函数也是这样,比如说传了a, b进去(a="aaa", b="bbb"), 
    //s1----->a, s2----->b 
    string temp=s1;//temp----->s1----->a 
    s1=s2; //s1----->s2----->b; 
    s2=temp; //s2----->temp----->a 
    结果是,s1和s2确实是Swap了,但是这种结果并不会影响到a和b
      

  20.   

    调用chang函数时只是传的str的值,并不会改变本身的值