频道直达 - 专题 - 新闻 - 技巧 - 组网 - 开发 - 安全 - web编程 - 图像 - 操作系统 - 数据库 - 教育 - 旅游 - 健康 - 时尚 - 驱动 - 软件 - 游戏 - 多媒体 - ERP - 讨论组

Java中String类型的参数传递问题的解析

来源: 作者:inc_root 出处:巧巧读书 2008-04-24 进入讨论组
    三、关于String参数传递问题的曲解之一??直接赋值与对象赋值

    String类型的变量作为参数时怎么会像基本类型变量那样以传值方式传递呢?关于这个问题,有些朋友给出过解释,但可惜并不正确。

    一种解释就是,对String类型的变量赋值时并没有new出对象,而是直接用字符串赋值,所以Java就把这个String类型的变量当作基本类型看待了。即,应该String str = new String(“original”);,而不是String str = “original”;。这是问题所在么?我们来为先前的示例稍微改造下,运行之后看看结果就知道了。改造后的代码如下:

    private void testB() {

    String originalStr = new String("original");

    System.out.println("Test B Begin:");

    System.out.println("The outer String: " + originalStr);

    changeNewString(originalStr);

    System.out.println("The outer String after inner change: " + originalStr);

    System.out.println("Test B End:");

    System.out.println();

    }

    public void changeNewString(String original) {

    original = new String(original + " is changed!");

    System.out.println("The changed inner String: " + original);

    }

    我们来看看这次运行结果是怎么样的:

    Test B Begin:

    The outer String: original

    The changed inner String: original is changed!

    The outer String after inner change: original

    Test B End.

    实践证明,这种说法是错的。

    实际上,字符串直接赋值和用new出的对象赋值的区别仅仅在于存储方式不同。

    简单说明下:

    字符串直接赋值时,String类型的变量所引用的值是存储在类的常量池中的。因为“original”本身是个字符串常量,另一方面String是个不可变类型,所以这个String类型的变量相当于是滴对一个常量的引用。这种情况下,变量的内存空间大小是在编译期就已经确定的。

    而new对象的方式是将“original”存储到String对象的内存空间中,而这个存储动作是在运行期进行的。在这种情况下,Java并不是把“original”这个字符串当作常量对待的,因为这时它是作为创建String对象的参数出现的。

    所以对String的赋值方式和其参数传值问题并没有直接联系。总之,这种解释并不是正解。

    四、关于String参数传递问题的曲解之二??“=”变值与方法变值

    又有些朋友认为,变值不同步的问题是处在改变值的方式上。

    这种说法认为:“在Java 中,改变参数的值有两种情况,第一种,使用赋值号”=“直接进行赋值使其改变;第二种,对于某些对象的引用,通过一定途径对其成员数据进行改变,如通过对象的本身的方法。对于第一种情况,其改变不会影响到被传入该参数变量的方法以外的数据,或者直接说源数据。而第二种方法,则相反,会影响到源数据??因为引用指示的对象没有变,对其成员数据进行改变则实质上是改变的该对象。”

    这种方式听起来似乎有些…,我们还是用老办法,编写demo,做个小试验,代码如下:

    private void testC() {

    String originalStr = newString("original");

    System.out.println("Test C Begin:");

    System.out.println("The outer String: " + originalStr);

    changeStrWithMethod(originalStr);

    System.out.println("The outer String after inner change: " + originalStr);

    System.out.println("Test C End.");

    System.out.println();

    }

    private static void changeStrWithMethod(String original) {

    original = original.concat(" is changed!");

    System.out.println("The changed inner String: " + original);

    }

    结果如下:

    Test C Begin:

    The outer String: original

    The changed inner String: original is changed!

    The outer String after inner change: original

    Test C End.

    怎么样,这证明了问题并不是出在这,又一个解释在实践论据下夭折了。

    那到底是什么原因导致了这种状况呢?

    好了,不卖关子了,下面说下我的解释。

更多文章 更多内容请看Java环境安装配置Java编程开发手册Java的类专题,或进入讨论组讨论。
收藏此文】【 】【打印】【关闭
相关图文阅读
频道图文推荐
健 康 咨 询
时 尚 咨 询
巧巧读书宗旨
相关专题
讨论组问题推荐
站内各频道最新更新文档
站内最新制作专题
热门关键字导读
Photoshop教 程照片处理 照片制作 PS快捷键 抠图
计 算 机 故 障XP系统修复
艺 术 与 设 计设计 流媒体 设计欣赏 边框
计 算 机 安 全ARP
站内频道文章精选
巧巧电脑频道编辑信箱  告诉我们您想看的专题或文章