首页 | 互联网 | IT动态 | IT培训 | Cisco | Windows | Linux | Java | .Net | Oracle | 软件测试 | C/C++ | 嵌入式开发 | 存储世界 | 服务器
网络设备 | IDC | 安全 | 求职招聘 | 数字网校 | 网页设计 | 平面设计 | 技术专题 | 电子书下载 | 教学视频 | 源码下载 | 搜索 | 博客 | 论坛
中国IT实验室Linux频道
中国IT教育
Google
首页 资讯动态 认证考试 新手入门 核心技术 高级技术 J2EE J2ME Java&XML 开源技术 其他技术 RSS订阅 论坛 专题
您现在的位置: 中国IT实验室 >> Java >> 新手入门 >> 基础入门 >> 正文

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


    三、关于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.

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

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

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

上一页  [1] [2] [3] 下一页

【责编:Ken】

中国IT教育

相关产品和培训
文章评论
 友情推荐链接
 认证培训
 专题推荐

 ·关于Java框架技术专题
 ·XML全攻略技术专题
 ·JAVA开源技术介绍专题
 ·Java嵌入式开发之J2ME技术专题
 ·超前体验 Oracle 11g的5个新特性…
 ·揭密使用VB.NET的五个实用技巧
 ·Oracle和SQL Server常用函数对比专题…
 ·展现C#世界 C#程序设计专题…
 ·Java入门 Tomcat的配置技巧精华专题…
 ·Oracle RMAN物理备份技术详解…
 今日更新
 社区讨论
 博客论点
 频道精选
 Java 频道导航