package cn.test;class Test { public static void main(String[] args)
{
Change chge = new Change();
String[] str = {new String("hello"),new String("world")};
String str1 = new String("hello"); chge.change(str,str1);
System.out.println(str[0]);
System.out.println(str1);


}
}
class Change
{
public static void change(String[] str2,String a)
{
str2[0] = new String("change");

a="change"; }
}
为什么string 和 string 数组机制不一样呢  

解决方案 »

  1.   

    此回复为自动发出,仅用于显示而已,并无任何其他特殊作用
    楼主【dutysmart】截止到2008-07-19 23:42:16的历史汇总数据(不包括此帖):
    发帖的总数量:17                       发帖的总分数:600                      每贴平均分数:35                       
    回帖的总数量:9                        得分贴总数量:0                        回帖的得分率:0%                       
    结贴的总数量:1                        结贴的总分数:20                       
    无满意结贴数:0                        无满意结贴分:0                        
    未结的帖子数:16                       未结的总分数:580                      
    结贴的百分比:5.88  %               结分的百分比:3.33  %                  
    无满意结贴率:0.00  %               无满意结分率:0.00  %                  
      

  2.   

    package cn.test;class Test { public static void main(String[] args)
    {
    Change chge = new Change();
    String[] str = {new String("hello"),new String("world")};
    String str1 = new String("hello"); chge.change(str,str1);
    System.out.println(str[0]);
    System.out.println(str[1]);
    System.out.println(str1);
    }
    }
    class Change
    {
    public static void change(String[] str2,String a)
    {
    str2[0] = new String("change");

    str2[1] = "change";

    a="change";
    }
    }
      

  3.   

    public static void change(String[] str2,String a)
    {
    str2[0] = new String("change");a="change";} 
    对于数组,你修改的是str2指向的数组对象中的数据,所以起作用。
    对于String,你修改的是a,让a指向了一个新的对象,外面的对象不受影响。
      

  4.   

    String[] str = {new String("hello"),new String("world")};
    String str1 = new String("hello"); chge.change(str,str1); 
    看方法里面,
    public static void change(String[] str2,String a)
    {
    str2[0] = new String("change");str2[1] = "change";a="change";

    调用的时候,str2是str的一份复制,所以str2和str指向同一个对象。a是str1的一份复制,所以a和str1也指向同一个对象。
    str2[0] = new String("change");//修改了str2指向的数组对象的第一个元素,因为str2和str指向同一个对象,所以函数指向完后,str指向的对象得到了修改。a="change";//你让a指向了一个新的对象,str1仍然指向”hello“,没有收到影响。
    方法执行完的时候a和str2已经不存在了,如果他们修改了外面的对象,那么外面能看到作用,如果他们修改了
    str2和a的本身,也就是说对这两个变量执行了赋值操作,外面不受影响。
      

  5.   

    public static void change(String[] str2,String a)
    {
    str2={new String("test1"),new String("test2")}; //修改了str2本身,而不是修改它指向的对象
    a="change";
    } 这样修改一下,你再看看就明白了。
      

  6.   

    string 是不可变类吧 那为什么编译能通过呢? 
      

  7.   

    你没有修改String类的内容啊。
    注意
    String str= new String("abc");
    str只是指向该对象的应用,它可以指向其他的String对象
      

  8.   

    那string 数组里面是修改 string的内容了吗 
      

  9.   

    修改了数组的内容,但是没有修改String的内容。String的内容你没有办法修改。
    String[] str = {new String("hello"),new String("world")}; 
    str[0]和str[1]是两个引用,同样可以改变他们引用的值
    str[0]=new String("test");
    str[1]=new String("test2");
      

  10.   

    因为String内容是无法修改的,举个可以修改的例子。public class Test{
        public static void main(String[] args) {
            StringBuilder builder=new StringBuilder("hello");//builder指向的对象的内容是hello
            System.out.println(builder);
            builder.append(" world");  //修改了上面创建的对象的内容,现在内容是 "hello world"
            System.out.println(builder);
            builder=new StringBuilder("test");//builder指向了新的对象,它的内容是test.原来的内容为//”hello world"的对象依然存在于堆内存中,但是我们没有办法访问到了,java虚拟机会在适当的时候回收内存
            
        }
    }
      

  11.   

    a="change";//你让a指向了一个新的对象,str1仍然指向”hello“,没有收到影响。 
    请问 为什么不受影响呢 
    str[0]和str[1]是两个引用,同样可以改变他们引用的值  引用不是指向源对象吗? 引用的值应该就是对象的值呀
      

  12.   

    请问str2[0]是指向了新对象吗  那么str[0]也随之被改变了吗?
      

  13.   

    ZangXT 大侠大概睡着了吧,呵呵。偶来回答:问题的关键是对于“引用”的理解。JAVA中,引用是没有值的。你说的引用的值是不存在的。引用和对象是分开的。引用是触及对象的一个途径。String对象是不变的。这一点一定要记住。String s = "abc";
    s = "xxx";
    这两行却是合法的。为什么呢?因为"xxx"是一个新的对象,“abc”还在,只是没有人管他了。(貌似很可怜)s现在指向的是xxx。
      

  14.   

    现在说你的问题的关键:public static void change(String[] str2,String a) {这里:(String[] str2,String a)你可以理解为String[] str2是引用,而String a是新建了一个对象.引用是可以改变的,你可以理解.但是a是一个新的引用,他指向了一个新的对象:"change".而原来的老引用和老对象:str1 = "hello"还是老样子.完全没有改变.其实我说String[] str2是引用的说法严格讲是错误的.这样说只是帮助你理解.
      

  15.   

    String[] str2,String a他们的关键区别在于引用的方式:数组和直接用对象的区别在于:数组引用过来,他再去操作的时候是:str2[x].是用索引的方式来引用.实际关系是:数组索引->对象引用->对象然后在public static void change(String[] str2,String a) 方法中:str2[0] = new String("change");
            
            a = "change"实际上不只a是一个新的引用.指向new String("change")的同样是一个新的引用.  String对象是不会变的,变的是引用.而str2[]在这里.他就用str2[0]指向了这个新的引用.相当于:String xx = new String("change");str2[0] = xx;这样就比较明白了吧.xx和a都变了.不变的是String对象和str2[0].str2[0]进入了函数,把老的引用踢了,用了新的xx引用.所以等他回去的时候,xx引用的新对象"change"也一起回去了.留下了a和str2[0]的老引用在那里等待垃圾回收^_^
      

  16.   

    楼主一定要记住java永远是值传递,也就是把参数的值拷贝一份给这个方法使用。
    在这个change(String[] str2, String a)也是这样的。这里str2的值不是你认为的数组,而是它指向的数组的首地址。所以你执行str2[0] = a;就改变了数组的实际
    内容。而方法外的str1还是指向这个数组的首地址,所以你看到str1这个数组的内容改变。String a的情况也是一样,就不重复了
      

  17.   


    class Change {
    public static void change(String[] str2, String a) {
    str2[0] = new String("change"); a = "change"; }
    }这里的str2和a都是引用的一个拷贝
    各自指向原来的对象
    他们是都不能改变的
    但是str2确实指向原来的对象
    所以str2[0] = new String("change");这样的操作是没有任何问题的
      

  18.   

    java数组参数传递是传首地址,基本变量的传址怎么实现啊?
      

  19.   

    java数组参数传递是传首地址的值。基本变量直接传变量的值。