A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

代码先贴上:
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不是一个引用类型的吗?按理说传递的是引用本身,应该是可以改变字符串的,可是结果为什么是这样????


评分

参与人数 1技术分 +1 收起 理由
朱神必 + 1

查看全部评分

21 个回复

倒序浏览
本帖最后由 张治国 于 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 类代表字符串,就像“你好”都是此类的实现类。记住字符串是常量,它们的值在创建之后不能更改

评分

参与人数 1技术分 +2 收起 理由
朱神必 + 2

查看全部评分

回复 使用道具 举报
(1)String 类型的一旦声明了内容就不能修改了。修改的话只能重新开辟空间,改变的是String的引用地址。
(2)如果要改变字符串内容,建议用StringBuffer类。

评分

参与人数 1技术分 +1 收起 理由
朱神必 + 1

查看全部评分

回复 使用道具 举报
你这里 方法  testString(String st);  调用 了后会从新产生一个字符串,并没有改变原来的那个字符串。
如果你想通过这种方法来改变你原来的字符串,那你通过返回字符类型来完成。
如:
    public static String  testString(String str)        //测试String的传值,能否改变实际参数的值?
    {
        str = new String("!嘿嘿!");            //写成str = "!嘿嘿!"; 结果一样
        return  str;
    }
  
   不然你System.out.println(s); 输出的这个字符串,还是原来那个,根本没有改变。
   

评分

参与人数 1技术分 +1 收起 理由
朱神必 + 1

查看全部评分

回复 使用道具 举报
  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. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
朱神必 + 1

查看全部评分

回复 使用道具 举报
我试了一下,发现不仅String有这个问题,Integer也有这个问题。
回复 使用道具 举报
张治国 发表于 2014-4-4 17:12
你这个代码啊 你所定义的方法,和结果一点关系也没有啊。

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

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

其实我想做一个方法,是有两个参数的就像changeString(String str1, String str2),然后根据两个字符串内容,始终让str1(当然我说的是实际参数)始终是长度较长的字符串、因为涉及两个String,所以通过返回值是不行的。
回复 使用道具 举报

我不是要打印它,而是要改变实际参数
回复 使用道具 举报
最喜蛋炒饭 发表于 2014-4-4 19:46
我不是要打印它,而是要改变实际参数


这还不容易,返回的就是长度最长的字符串
public static  String  changeString(String str1, String str2)
{
           return  ( str1.length()>str2.length() ) ?  str1  :   str2;
回复 使用道具 举报
最喜蛋炒饭 发表于 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;               
        }

}
回复 使用道具 举报
String 类代表字符串。Java 程序中的所有字符串字面值(如 "abc" )都作为此类的实例实现。

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

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

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

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

是交换str1和str2,不是返回长的字符串!!!
回复 使用道具 举报
杨庆雷 发表于 2014-4-4 20:02
package test2;

public class Main {

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

我好像明白了,不过要想实现如果str1的长度始终要大于str2的长度,否则让str1与str2的内容交换,怎么办呢?最好做成一个方法,直接判断后交换,我会,可是我就想做成一个方法,好提高代码的重用性,请问有没有什么好的方法?
回复 使用道具 举报
最喜蛋炒饭 发表于 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 21:37
是交换str1和str2,不是返回长的字符串!!!

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

貌似是不可能的
就像我之前还想
swap (int a,int b){
int temp = a;
a =b;
b = temp;
}
其中外面的a,b没换
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马