黑马程序员技术交流社区

标题: 有关String类,形参不能改变参的问题 [打印本页]

作者: 只会金克斯    时间: 2014-12-29 22:43
标题: 有关String类,形参不能改变参的问题
public class CountDemo {
        public static void main(String[] args) {
               
        String s = new String("adc");
        method(s);
        System.out.println(s);
        }
        public static  void  method(String s)
        {
                s =  s+"aaa";
                //System.out.println(s);
        }
}
能不能有大神 给我说下原理是什么??
作者: lixing123456    时间: 2014-12-29 22:54
。。。。。。。。。。。路过
作者: 只会金克斯    时间: 2014-12-29 22:56
lixing123456 发表于 2014-12-29 22:54
。。。。。。。。。。。路过

大神,原理是啥子,
作者: 只会金克斯    时间: 2014-12-29 23:07
大神呢。。。。。。
作者: 常强儿    时间: 2014-12-29 23:15
string这样子只是在变引用,而原来的是不变的,要是stringbuilder,使用append肯定就变了
作者: 赵涛涛    时间: 2014-12-29 23:18
刚学没多久,说一下愚见。
看图
作者: 赵涛涛    时间: 2014-12-29 23:19
不知道你是否能看懂我发的图?
作者: 杨佳名    时间: 2014-12-30 01:07
Java中方法参数传递是值传递
作者: Eagle    时间: 2014-12-30 08:15
       String s = new String("adc");
       s = method(s);
        System.out.println(s);
        }
        public static  String method(String s)
        {
                s =  s+"aaa";
                //System.out.println(s);
                return s;
        }

楼主你这样打印试试,
因为你s=s+“aaa”是传进来的,没有赋值到外面的参数。
与主函数里的s无关。
作者: xiao飞    时间: 2014-12-30 11:12
因为String类是被fianl修饰的,字符串是常量;它们的值在创建之后不能更改,String s = new String("abc");而且你这样是创建了两个字符串,一个是空字符串 一个是abc字符串,如果你要对字符串进行更改,单线程就要用StringBuilder 不同步的,多线程就要用StringBuffer 是同步的, 我是这样理解 ,不知道能不能帮到你
作者: 飘渺之旅    时间: 2014-12-31 18:56
图画的很形象,已收藏
作者: Mydream524    时间: 2014-12-31 18:58
太吊了,学习了。
作者: 只会金克斯    时间: 2014-12-31 19:35
赵涛涛 发表于 2014-12-29 23:19
不知道你是否能看懂我发的图?

没有看懂。{:3_46:}
作者: 只会金克斯    时间: 2014-12-31 19:36
杨佳名 发表于 2014-12-30 01:07
Java中方法参数传递是值传递

如果传递的是引用对象,传递的不是地址值吗?
作者: 只会金克斯    时间: 2014-12-31 19:41
Eagle 发表于 2014-12-30 08:15
String s = new String("adc");
       s = method(s);
        System.out.println(s);

这个return。。。。看来我还是没有理解。
作者: 只会金克斯    时间: 2014-12-31 19:42
xiao飞 发表于 2014-12-30 11:12
因为String类是被fianl修饰的,字符串是常量;它们的值在创建之后不能更改,String s = new String("abc"); ...

学渣想问问,空字符是怎么创建的
作者: 西风烈123    时间: 2014-12-31 19:43
ooooooooooooooooooooo
作者: 青衫禅客    时间: 2014-12-31 21:52
本帖最后由 青衫禅客 于 2014-12-31 22:19 编辑

因为String类型的变量一旦赋值就不可更改的,而方法中重新运算出的String是一个新创建的值!注意String是引用数据类型的!这是我自己的总结:
  基本数据类型:传入方法中的是变量代表的数值本身,所以对原成员变量没有影响

引用数据类型:在传入方法中的时候,传入的是数据实际的内存地址值。所以对原成员变量有影响。

String类型(特殊的引用数据类型):String类型的变量一旦赋值就不可更改,可以看做是一个常量。传入方法中运算,对原成员变量没有影响。


作者: Eagle    时间: 2014-12-31 23:35
只会金克斯 发表于 2014-12-31 19:41
这个return。。。。看来我还是没有理解。

就是将改变的s返回。让主函数里的s接收返回的值
作者: qowoeo7538    时间: 2015-1-1 00:04
曾经写过注释,不过没了,不过可以告诉你是因为他们操作的地址是不一样的.
作者: 小僧玄奘    时间: 2015-1-1 20:24
传递的是一个副本。相当于拷贝一份过去修改。 对原数据没影响
作者: 只会金克斯    时间: 2015-1-2 21:09
青衫禅客 发表于 2014-12-31 21:52
因为String类型的变量一旦赋值就不可更改的,而方法中重新运算出的String是一个新创建的值!注意String是引 ...

恩恩,就是把jvm的底层运算 看作是常量运算吧。。
作者: 只会金克斯    时间: 2015-1-2 21:10
kakasa 发表于 2015-1-1 16:59
按我的理解,形参和实参是两个东西,也就是main中的str和method中的str存在于不同空间。

它们之间传递的不是地址值吗
作者: 只会金克斯    时间: 2015-1-2 21:11
小僧玄奘 发表于 2015-1-1 20:24
传递的是一个副本。相当于拷贝一份过去修改。 对原数据没影响

这样子的话,是解释的通
作者: 新鲜感    时间: 2015-1-2 21:16
这里没有返回值。
作者: zcyemenye    时间: 2015-1-2 21:59
String类型存储在String常量池中,byte数据类型存储在byte常量池中,因为它们使用频率太高了,所以来回的创建效率不高,所以Java中引入了常量池的概念,其中String常量池默认是没字符串的,当你新建字符串的时候字符串就会存入常量池,并且不会改变,等待垃圾回收机制启动收回它。byte常量池是-128~127之间的整数默认存在,直接调用,这是它们之间的小区别。主要是为了提高效率。
作者: 只会金克斯    时间: 2015-1-2 22:43
kakasa 发表于 2015-1-2 21:47
就是地址啊,
str+"ddd"这个动作是创建新对象,分配了新地址,str的地址变了。而且只是形参的地址变了, ...

谢了。。
作者: 只会金克斯    时间: 2015-1-2 22:45
zcyemenye 发表于 2015-1-2 21:59
String类型存储在String常量池中,byte数据类型存储在byte常量池中,因为它们使用频率太高了,所以来回的创 ...

恩恩。。是的,我一开始的理解是,传递地址值过去了以后,就会对堆中的对象进行修改。。。。。。
作者: 小僧玄奘    时间: 2015-1-3 01:58
只会金克斯 发表于 2015-1-2 21:11
这样子的话,是解释的通

你百度一下值传递和引用传递。  虽然在java里面没有这个"区分"。
作者: 只会金克斯    时间: 2015-1-3 21:10
小僧玄奘 发表于 2015-1-3 01:58
你百度一下值传递和引用传递。  虽然在java里面没有这个"区分"。

谢了。。。。。




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