public class StringTest {
    public StringTest() {
    }
    public static void main(String[] args) {
        StringTest temp = new StringTest();
        String a = new String("bbbbbbbbbbb");
        temp.change(a);
        System.out.println(a);
    }
    public void change(String temp){
        temp = "aaaaaaaaaaaa";
    }
}对于类型我知道他是引用。。但是为什么会输入bbbbbbbbbbb呢?

解决方案 »

  1.   

    class field and method field...temp belongs to method change(). So after running change(), temp is not available any more...So it cannot change the value of a...
      

  2.   

    if you change change() to:
    public String change(String temp){ 
            temp = "aaaaaaaaaaaa";         return temp;
        } and String a = change(a);
      

  3.   

    http://www.learndiary.com/archives/diaries/2713.htm
    http://java.ccidnet.com/art/3737/20050527/472879_1.html
      

  4.   

    public void change(String temp){ 上面的String temp只是a对象地址的一个拷贝..因此,改变temp指向的地址并不会影响a所指向的地址..
      

  5.   

    Java里除了传递数组参数是按地址传递的之外,其余类型的参数传递都是按值,也就是传引用。所以这里楼主通过change(String temp)方法,并不能改变原来的a的值(就是main函数里定义的那个String a = new String("bbbbbbbbbbb"); ),temp只是a的一个副本,change函数改变的也只是这个副本的值,跟原来a的值没关系.
      

  6.   

    对于引用类型来说...传递的应该是地址..既然是地址..我改变了当前地址的值...为什么却没有改变..
    难道String类型 只是传递的副本?
      

  7.   


    按照你的说法...除开数组是引用传递(传递的是地址),其他的全是值传递了哦(传递副本)
    那我传递其他的类型就不会..比如说Vector....
      

  8.   

    是这样的..a中保存了字符串bbbbbbbbbbb的地址,调用change函数后,temp也保存了字符串bbbbbbbbbbb的地址,即两个对象指向同一字符串..当你执行temp = "aaaaaaaaaaaa"; 后,temp对象指向aaaaaaaaaaaa的地址.但a的指向不变..
      

  9.   

    还是没理解。如果String是引用类型他应该传递的是一个地址
    我把那个地址从新引用了bbbbbbbbbbbb
    那个地址的值就应该是bbbbbbb了。。
    不解............
      

  10.   

    这个兄弟...按照你上面说的,那String传递的只是一个副本了哦?
    但是如果这样的话我又晕了..
    他是引用类型为什么传递的是副本呢?
      

  11.   


    String是引用类型。为什么会传递的是副本呢?
      

  12.   

    现在有一台电视机bbbbbbbbbbb,拿一个遥控器a指向它(遥控器就可以控制电视机了).
    然后将遥控器a复制一个副本temp,temp也就理所当然指向电视机bbbbbbbbbb了.
    接着你将遥控器temp指向了另一台电视机aaaaaaaaaaaaaa.
    请问现在遥控器a还是控制电视机bbbbbbbbbbbbb吗?lz好好体会一下.
      

  13.   

    change方法里面的 赋值只是一个局部变量的赋值,对方法外面的值没有作用。
      

  14.   

    好像最近特别流行这个问题:
    java基本类型(byte、int、char、long、float、double、boolean和short)是传值,也就是传的是副本,而其余传的是引用(所谓引用传递就是把对象的引用地址传进函数,而不是像值传递那样产生一个副本),对于字符串对象来说,虽然在参数传递的时候也是引用传递,但是java虚拟机在函数内部对字符串对象进行了特殊处理--视String对象为常量(final) 所以对传进来的引用地址所引用的string对象比能直接进行修改,而是产生一个副本对其进行操作,对其进行的操作不会影响原来的值。
      

  15.   

    因为形式参数是一个新的变量。public class Test {
      String a="aaaa";
      void chang(String temp) {
        temp="bbbb";
      }
      public static void main(String[] args) {
        change(a);
      }
    }
    这段代码的执行过程是:
    1.  加载类Test
    2.  初始化成员变量a, a指向内存的dataStack的字符串"aaaa"
    3.  进入main()方法
    4.  调用change方法,把a的值传给temp.这时temp的值就是"aaaa"
    5.  调用temp="bbbb"这一句,temp的值改变为"bbbb";
    6.  change(a)调用结束.
    可以发现,a的值其实没有改变.
      

  16.   

      可以用类对象的引用来转递。。即可实现改变。
    class op
    {
    public static void main(String[] agrs)
    {
        aa a=new aa();
        a.w="bbbbb";
        maa(a);
        System.out.println(a.w);
    }
        static void maa(aa x)
    {
    x.w="aaaaa";
    }
    }
    class aa
    {
        String w;
    }
      

  17.   

    你只改变了局部变量,即使你return也没有用,主函数中没有接受这个返回值,同样只会输出bbb……
      

  18.   

    你change类没有返回temp的值阿...,就相当于.我把卫星发射出去了,但是我并没有回收,这样的话,实验实的人去怎么可能拿到回收仓呢...
    public class StringTest { 
        public StringTest() { 
        } 
        public static void main(String[] args) { 
            StringTest temp = new StringTest(); 
            String a = new String("bbbbbbbbbbb"); 
            a=temp.change(a); 
            System.out.println(a); 
        } 
        public String change(String temp){ 
            temp = "aaaaaaaaaaaa"; 
            return temp;
        }