免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
1234下一页
最近访问板块 发新帖
查看: 5747 | 回复: 35
打印 上一主题 下一主题

老题从谈 ---再次让我迷惑 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-02-06 22:06 |只看该作者 |倒序浏览
最近看到一个题目:
package think;

public class Think_1 {
   
    public Think_1(int i) {
    }

    public static void change(String str)
    {
        str ="new";
    }

    public static void main(String[] args) {
        String str = "old";
        System.out.println(str);
        change(str);
        System.out.println(str);
    }
}

问输出的结果,应该是
old
old
但却想不出原因,我的想法是:
str 作为String对象的引用,被按引用值传如change()方法,但在方法内 的str 与main里的str存着相同的内容,然后被 重新赋值 为"new",这样不是已经改变了str 这个引用变量的 实际值了吗?怎么最后输出str的时候,起内容还是"old"呢 ?
我给自己的解释是:String 类型作为final 类型,一旦赋值,就不再被改变,二,str作为常量在载入时被载入到常量池中,它只能和其他内存地址交互,而不能被覆盖。

我觉得我的理解肯定有问题,但不晓得该怎么解释,我是新手,请高手不吝赐教。。。。

论坛徽章:
0
2 [报告]
发表于 2007-02-06 22:22 |只看该作者
public static void change(String str)
    {
        str ="new";
    }
参数传递过来的是个值,而不是指针,所以不会影响函数外的str的结果。

请搜索我以前的老贴,里面有很详细的解释

论坛徽章:
0
3 [报告]
发表于 2007-02-06 22:33 |只看该作者
嗯,JAVA的参数传递 只有 传值 一种

论坛徽章:
0
4 [报告]
发表于 2007-02-06 22:49 |只看该作者
恩,我也晓得 JAVA 是按值传参的,但 不是要分为传基本类型和对象两种吗? 基本类型 直接把值传入方法,而对象,是把引用值传入方法啊


Class A
{
   String i = "old";
   public staic void changeStr(A a)
  {
      a.i="new";
  }
  public static void main(String[] args)
{
     A a = new A();
    System.out.println(a.i);
    change(a)
    System.out.println(a.i);
}
}

却是输出的:
old
new

这里传入changeStr()的 应该是ref到new A()的 a吧。。

论坛徽章:
0
5 [报告]
发表于 2007-02-06 22:59 |只看该作者
原帖由 perryhg 发表
在函数中对传入的参数变量进行赋值操作,只能在函数范围内改变局部变量指向的引用地址,但是不会改变原始地址的内容。因此,在changeValue2(...)函数内部的vo1和函数外的vo1虽然名字相同,但是实际上是不同的实例变量,只不过指向了和函数外的vo1同样的地址,所以当我们用vo1=... 对其进行赋值的时候,只不过是把函数内的临时变量指向了新的地址,并没有改变原始vo1内存地址中的内容。


似乎有些理解了。。。。。。原来只是在局部范围内改变了起临时引用而已——尽管临时引用和原始引用等值,但并未改变原始引用

是否可以这样理解?

论坛徽章:
0
6 [报告]
发表于 2007-02-06 23:08 |只看该作者
又想了一下,看来可以理解我贴出的第二段代码了,我的理解是:

既然在changeStr()里面是一个外部引用的 copy,那么,在方法里面,如果单纯对这个COPY做改变,是不会影响到外部的,但如果用“.”来操作,由于copy里面的地址与原始对象的地址一样,都为一个引用地址,那么用点来操作的时候,就会影响到 ref 的对象了,所以,第二种情况下,在局部范围中,是改变了外部 变量的,

是否这样?请指正

论坛徽章:
0
7 [报告]
发表于 2007-02-07 08:23 |只看该作者
String类型虽然是一个对象,但是它与其它的对象不同,在参数中改变它,并不影响它原来的值

在这种情况下,可以认为它就是一个基本类型

论坛徽章:
0
8 [报告]
发表于 2007-02-07 09:45 |只看该作者
http://bbs.chinaunix.net/archiver/?tid-719880.html

CU的搜索真烂,归档的就找不到了,还是靠google找出来了

论坛徽章:
0
9 [报告]
发表于 2007-02-07 09:53 |只看该作者
原帖由 cnflybird 于 2007-2-6 23:08 发表
又想了一下,看来可以理解我贴出的第二段代码了,我的理解是:

既然在changeStr()里面是一个外部引用的 copy,那么,在方法里面,如果单纯对这个COPY做改变,是不会影响到外部的,但如果用“.”来操作,由于co ...

基本正确

论坛徽章:
0
10 [报告]
发表于 2007-02-07 11:32 |只看该作者
原帖由 艾斯尼勒 于 2007-2-6 22:33 发表
嗯,JAVA的参数传递 只有 传值 一种


有传值和指针,两种,至于那种类型是传递的是指针,就不用我说了吧
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP