黑马程序员技术交流社区

标题: String不是引用类型吗?为什么传递参数,竟然不能改变 [打印本页]

作者: 最喜蛋炒饭    时间: 2014-4-4 16:05
标题: String不是引用类型吗?为什么传递参数,竟然不能改变
代码先贴上:
public static void main(String[] args)
    {        
        String s = "嘻嘻";
        testString(s);
        System.out.println(s);
        
        String s1 = new String("123");
        testString(s1);
        System.out.println(s1);
    }
    public static void testString(String str)        //测试String的传值,能否改变实际参数的值?
    {
        str = new String("!嘿嘿!");            //写成str = "!嘿嘿!"; 结果一样
    }


运行结果:
嘻嘻
123


String不是一个引用类型的吗?按理说传递的是引用本身,应该是可以改变字符串的,可是结果为什么是这样????



作者: 张治国    时间: 2014-4-4 17:12
本帖最后由 张治国 于 2014-4-4 17:16 编辑

你这个代码啊 你所定义的方法,和结果一点关系也没有啊。

你是不是想要这样的结果啊

public static void main(String[] args) {
        String s = "黑马";
        testString(s);
        String s1 = new String("s1你好");
        testString(s1);
}        

public static void testString(String str){
        str = new String("你好");
        System.out.println(str);
}

结果都是你好

String 类代表字符串,就像“你好”都是此类的实现类。记住字符串是常量,它们的值在创建之后不能更改

作者: wuyuecns    时间: 2014-4-4 17:47
(1)String 类型的一旦声明了内容就不能修改了。修改的话只能重新开辟空间,改变的是String的引用地址。
(2)如果要改变字符串内容,建议用StringBuffer类。


作者: 向阳泪无痕    时间: 2014-4-4 18:12
你这里 方法  testString(String st);  调用 了后会从新产生一个字符串,并没有改变原来的那个字符串。
如果你想通过这种方法来改变你原来的字符串,那你通过返回字符类型来完成。
如:
    public static String  testString(String str)        //测试String的传值,能否改变实际参数的值?
    {
        str = new String("!嘿嘿!");            //写成str = "!嘿嘿!"; 结果一样
        return  str;
    }
  
   不然你System.out.println(s); 输出的这个字符串,还是原来那个,根本没有改变。
   
作者: 杨庆雷    时间: 2014-4-4 18:58
  1. package test2;

  2. public class Main {

  3.         public static void main(String[] args) {
  4.                 // TODO Auto-generated method stub
  5.                 String s = "嘻嘻";
  6.                 testString(s);
  7.                
  8.         }
  9.        
  10.         public static void testString(String str){
  11.                 str = new String("嘿嘿");
  12.                 System.out.println(str);
  13.                
  14.         }

  15. }
复制代码

作者: haixian    时间: 2014-4-4 19:24
我试了一下,发现不仅String有这个问题,Integer也有这个问题。
作者: 最喜蛋炒饭    时间: 2014-4-4 19:39
张治国 发表于 2014-4-4 17:12
你这个代码啊 你所定义的方法,和结果一点关系也没有啊。

你是不是想要这样的结果啊

字符串是常量,可是String类型的引用可不是啊!!!!应该是可以更改其指向的啊,我的目的就是为了更改其指向!
作者: 最喜蛋炒饭    时间: 2014-4-4 19:45
向阳泪无痕 发表于 2014-4-4 18:12
你这里 方法  testString(String st);  调用 了后会从新产生一个字符串,并没有改变原来的那个字符串。
如 ...

其实我想做一个方法,是有两个参数的就像changeString(String str1, String str2),然后根据两个字符串内容,始终让str1(当然我说的是实际参数)始终是长度较长的字符串、因为涉及两个String,所以通过返回值是不行的。
作者: 最喜蛋炒饭    时间: 2014-4-4 19:46
杨庆雷 发表于 2014-4-4 18:58

我不是要打印它,而是要改变实际参数
作者: 向阳泪无痕    时间: 2014-4-4 19:59
最喜蛋炒饭 发表于 2014-4-4 19:46
我不是要打印它,而是要改变实际参数


这还不容易,返回的就是长度最长的字符串
public static  String  changeString(String str1, String str2)
{
           return  ( str1.length()>str2.length() ) ?  str1  :   str2;

作者: 杨庆雷    时间: 2014-4-4 20:02
最喜蛋炒饭 发表于 2014-4-4 19:46
我不是要打印它,而是要改变实际参数

package test2;

public class Main {

        public static void main(String[] args) {
                // TODO Auto-generated method stub
                String s = "嘻嘻";
                String getBack = testString(s);
                System.out.println(getBack);
               
        }
       
        public static String testString(String s){
                s = new String("嘿嘿");
        return s;               
        }

}

作者: 黄泉    时间: 2014-4-4 20:11
String 类代表字符串。Java 程序中的所有字符串字面值(如 "abc" )都作为此类的实例实现。

字符串是常量;它们的值在创建之后不能更改。字符串缓冲区支持可变的字符串。因为 String 对象是不可变的,所以可以共享。

StringBuffer
线程安全的可变字符序列。一个类似于 String 的字符串缓冲区,但不能修改。虽然在任意时间点上它都包含某种特定的字符序列,但通过某些方法调用可以改变该序列的长度和内容。

可将字符串缓冲区安全地用于多个线程。可以在必要时对这些方法进行同步,因此任意特定实例上的所有操作就好像是以串行顺序发生的,该顺序与所涉及的每个线程进行的方法调用顺序一致。

StringBuffer 上的主要操作是 append 和 insert 方法,可重载这些方法,以接受任意类型的数据。每个方法都能有效地将给定的数据转换成字符串,然后将该字符串的字符添加或插入到字符串缓冲区中。append 方法始终将这些字符添加到缓冲区的末端;而 insert 方法则在指定的点添加字符。
作者: 最喜蛋炒饭    时间: 2014-4-4 21:37
向阳泪无痕 发表于 2014-4-4 19:59
这还不容易,返回的就是长度最长的字符串
public static  String  changeString(String str1, String str ...

是交换str1和str2,不是返回长的字符串!!!
作者: 最喜蛋炒饭    时间: 2014-4-4 21:41
杨庆雷 发表于 2014-4-4 20:02
package test2;

public class Main {

我是想设计一个方法,将实际传来的两个参数,始终让str1长于str2,不是只用返回一个字符串,也就是说,我想实现一个changeString(String str1,String str2);然后使传进来的参数(不是形参,是实参)始终是str1长于或等于str2、怎么办啊?
作者: 林发明    时间: 2014-4-4 21:50
testString(String str)中的str确实接收了传递过来的s和s1的引用,但是“str = new String("!嘿嘿!");  ”这句代码又将一个新的引用赋值给了str,所以对主程序中的s和s1没有影响。
作者: 最喜蛋炒饭    时间: 2014-4-4 22:07
林发明 发表于 2014-4-4 21:50
testString(String str)中的str确实接收了传递过来的s和s1的引用,但是“str = new String("!嘿嘿!");   ...

我好像明白了,不过要想实现如果str1的长度始终要大于str2的长度,否则让str1与str2的内容交换,怎么办呢?最好做成一个方法,直接判断后交换,我会,可是我就想做成一个方法,好提高代码的重用性,请问有没有什么好的方法?

作者: 杨庆雷    时间: 2014-4-4 22:30
最喜蛋炒饭 发表于 2014-4-4 21:41
我是想设计一个方法,将实际传来的两个参数,始终让str1长于str2,不是只用返回一个字符串,也就是说,我 ...

package test2;

public class Test03 {
        public static void main(String[] args) {
                String str = ChangeString("ad","aff");
                System.out.println(str);
        }
       
        public static String ChangeString(String str1,String str2){
                if(str1.length()<str2.length()){
                        str1 = str2;
                }
                return str1;
        }
}


其实 我也不知道你要干什么了、、、
刚学java  也不怎么懂
作者: 向阳泪无痕    时间: 2014-4-4 22:36
最喜蛋炒饭 发表于 2014-4-4 21:37
是交换str1和str2,不是返回长的字符串!!!

额                                    
作者: 黄泉    时间: 2014-4-5 10:55
基本类型,比如int a = 5。那么5就是字面量
而String str = "嘻嘻"; 里面的str不是真的"嘻嘻"内容,而是一个引用,指向堆里面的"嘻嘻"
String是一个引用类型,是JAVA的一个类,我们String str = "嘻嘻"; 操作可以等于new  String("嘻嘻");
这种类型的还有int的包装类Integer等等
作者: 遗失的美好YXJ    时间: 2014-7-14 23:05
最喜蛋炒饭 发表于 2014-4-4 21:41
我是想设计一个方法,将实际传来的两个参数,始终让str1长于str2,不是只用返回一个字符串,也就是说,我 ...

貌似是不可能的
就像我之前还想
swap (int a,int b){
int temp = a;
a =b;
b = temp;
}
其中外面的a,b没换
作者: liujingnan    时间: 2014-7-20 13:19
你这个代码啊 你所定义的方法,和结果一点关系也没有啊。

你是不是想要这样的结果啊

public static void main(String[] args) {
        String s = "黑马";
        testString(s);
        String s1 = new String("s1你好");
        testString(s1);
}        

public static void testString(String str){
        str = new String("你好");
        System.out.println(str);
}

作者: 黑马-胡明    时间: 2014-7-29 10:44
看一看····




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2