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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 只会金克斯 中级黑马   /  2014-12-29 22:43  /  2742 人查看  /  33 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

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);
        }
}
能不能有大神 给我说下原理是什么??

评分

参与人数 1技术分 +1 收起 理由
杨佳名 + 1 淡定

查看全部评分

33 个回复

正序浏览
小僧玄奘 发表于 2015-1-3 01:58
你百度一下值传递和引用传递。  虽然在java里面没有这个"区分"。

谢了。。。。。
回复 使用道具 举报
只会金克斯 发表于 2015-1-2 21:11
这样子的话,是解释的通

你百度一下值传递和引用传递。  虽然在java里面没有这个"区分"。
回复 使用道具 举报
zcyemenye 发表于 2015-1-2 21:59
String类型存储在String常量池中,byte数据类型存储在byte常量池中,因为它们使用频率太高了,所以来回的创 ...

恩恩。。是的,我一开始的理解是,传递地址值过去了以后,就会对堆中的对象进行修改。。。。。。
回复 使用道具 举报
kakasa 发表于 2015-1-2 21:47
就是地址啊,
str+"ddd"这个动作是创建新对象,分配了新地址,str的地址变了。而且只是形参的地址变了, ...

谢了。。
回复 使用道具 举报
String类型存储在String常量池中,byte数据类型存储在byte常量池中,因为它们使用频率太高了,所以来回的创建效率不高,所以Java中引入了常量池的概念,其中String常量池默认是没字符串的,当你新建字符串的时候字符串就会存入常量池,并且不会改变,等待垃圾回收机制启动收回它。byte常量池是-128~127之间的整数默认存在,直接调用,这是它们之间的小区别。主要是为了提高效率。
回复 使用道具 举报
只会金克斯 发表于 2015-1-2 21:10
它们之间传递的不是地址值吗

就是地址啊,
str+"ddd"这个动作是创建新对象,分配了新地址,str的地址变了。而且只是形参的地址变了,主函数的没变。

字符串一旦被初始化就不会被改变,意思就是str+"ddd"这个动作,不是在改变本来的对象,而是创建新的对象,新的对象当然要分配新的地址,不是么?

如果你用 StringBuffer初始化成"aaa"后,在method用add方法添加"ddd"话就不一样了,因为这是在对对象本身进行修改,并没有创建别的对象。

把method里的变量名改成别的名字,这样可能更好理解吧,
回复 使用道具 举报
这里没有返回值。
回复 使用道具 举报
小僧玄奘 发表于 2015-1-1 20:24
传递的是一个副本。相当于拷贝一份过去修改。 对原数据没影响

这样子的话,是解释的通
回复 使用道具 举报
kakasa 发表于 2015-1-1 16:59
按我的理解,形参和实参是两个东西,也就是main中的str和method中的str存在于不同空间。

它们之间传递的不是地址值吗
回复 使用道具 举报
青衫禅客 发表于 2014-12-31 21:52
因为String类型的变量一旦赋值就不可更改的,而方法中重新运算出的String是一个新创建的值!注意String是引 ...

恩恩,就是把jvm的底层运算 看作是常量运算吧。。
回复 使用道具 举报
传递的是一个副本。相当于拷贝一份过去修改。 对原数据没影响
回复 使用道具 举报
按我的理解,形参和实参是两个东西,也就是main中的str和method中的str存在于不同空间。
  1. public static void main(String[] args)throws Exception
  2.         {
  3.                 String str="aaa";
  4.                 method(str);
  5.                 str=str+"ddd";
  6.         }
  7.         private static void method(String str) throws Exception
  8.         {
  9.                 System.out.println(str.hashCode());
  10.                 str=str+"ddd";//当执行str+"ddd"这个动作时,str+"ddd"已经是新的对象,在内存分配了新的地址。
  11.                        //把地址赋给了形参str。
  12.                        //至始至终main中的str根本就没有改变,他一直在指向"aaa"这个字符串对象。
复制代码



回复 使用道具 举报
曾经写过注释,不过没了,不过可以告诉你是因为他们操作的地址是不一样的.
回复 使用道具 举报
Eagle 高级黑马 2014-12-31 23:35:26
19#
只会金克斯 发表于 2014-12-31 19:41
这个return。。。。看来我还是没有理解。

就是将改变的s返回。让主函数里的s接收返回的值
回复 使用道具 举报
本帖最后由 青衫禅客 于 2014-12-31 22:19 编辑

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

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

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

回复 使用道具 举报
ooooooooooooooooooooo
回复 使用道具 举报
xiao飞 发表于 2014-12-30 11:12
因为String类是被fianl修饰的,字符串是常量;它们的值在创建之后不能更改,String s = new String("abc"); ...

学渣想问问,空字符是怎么创建的
回复 使用道具 举报
Eagle 发表于 2014-12-30 08:15
String s = new String("adc");
       s = method(s);
        System.out.println(s);

这个return。。。。看来我还是没有理解。
回复 使用道具 举报
杨佳名 发表于 2014-12-30 01:07
Java中方法参数传递是值传递

如果传递的是引用对象,传递的不是地址值吗?

点评

地址值也是值传啊 java只有值传递  发表于 2014-12-31 23:45
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马