又是一道面试题,来测试你的Java基础是否牢固。

题目:以下代码的运行结果是?

public class TestValue {
public static void test(String str) {
str="World"; //代码3
}
public static void main(String[] args) {
String string = "Hello"; //代码1
test(string); //代码2
System.out.println(string); //代码4
}
}

运行结果是:Hello

解析:运行到达代码1时,系统在堆内存中开辟一个内存空间来生成一个String对象,并把这个对象的值设为“Hello”,然后将该对象分配给栈内存中的string变量来引用。变量string是被实际分配的引用对象,此引用保存着“Hello”在堆内存的地址值。

运行到达代码2,进入test(String str)方法,变量string的(引用)值的副本被传递给test方法。即将string变量的副本赋给test方法的形参str。此时变量string和test()方法内的变量str都是引用内存中的值为“Hello”的String对象。

运行到达代码3时,系统在堆内存中开辟一个内存空间来生成一个新的String对象,并把这个对象的值设为“World”,然后将该对象分配给栈内存中的str变量来引用。此时变量string仍然引用内存中的值为“Hello”的String对象,而test()方法内的变量str则引用内存中的值为“World”的String对象。

运行到达代码4时,test(String
str)方法结束了,方法内的变量str作用消失,栈内存中没有了变量str,还有变量string。堆内存中值为“Hello”的String对象依然被变量string引用,值为“World”的String对象没有被引用。所以打印结果为:Hello

下面是内存示意图。

当然如果我们真的需要改变对象的值,可以尝试使用StringBuffer对象来处理。代码如下

public class TestValue {
public static void main(String[] args) {
StringBuilder string = new StringBuilder("Hello");
change(string);
System.out.println(string);
} public static void change(StringBuilder str) {
str.delete(0, 5).append("World");
}
}

打印结果为:World

读者也可以参考以下链接:

http://www.programcreek.com/2013/09/string-is-passed-by-reference-in-java/

==================================================================================================

  作者:欧阳鹏  欢迎转载,与人分享是进步的源泉!

  转载请保留原文地址:http://blog.csdn.net/ouyang_peng

==================================================================================================

我的Java开发学习之旅------>Java String对象作为参数传递的问题解惑的更多相关文章

  1. 我的Java开发学习之旅------>Java 格式化类(java.util.Formatter)基本用法

    本文参考: http://docs.oracle.com/javase/1.5.0/docs/api/java/util/Formatter.html http://www.blogjava.net/ ...

  2. 我的Java开发学习之旅------>Java使用Fork/Join框架来并行执行任务

    现代的计算机已经向多CPU方向发展,即使是普通的PC,甚至现在的智能手机.多核处理器已被广泛应用.在未来,处理器的核心数将会发展的越来越多. 虽然硬件上的多核CPU已经十分成熟,但是很多应用程序并未这 ...

  3. 我的Java开发学习之旅------>Java NIO 报java.nio.charset.MalformedInputException: Input length = 1异常

    今天在使用Java NIO的Channel和Buffer进行文件操作时候,报了java.nio.charset.MalformedInputException: Input length = 1异常, ...

  4. 我的Java开发学习之旅------>Java使用ObjectOutputStream和ObjectInputStream序列号对象报java.io.EOFException异常的解决方法

    今天用ObjectOutputStream和ObjectInputStream进行对象序列化话操作的时候,报了java.io.EOFException异常. 异常代码如下: java.io.EOFEx ...

  5. 我的Java开发学习之旅------>Java利用Comparator接口对多个排序条件进行处理

    一需求 二实现Comparator接口 三验证排序结果 验证第一条件首先按级别排序级别最高的排在前面 验证第二条如果级别相等那么按工资排序工资高的排在前面 验证第三条如果工资相当则按入职年数排序入职时 ...

  6. 我的Java开发学习之旅------>Java语言中方法的参数传递机制

    实参:如果声明方法时包含来了形参声明,则调用方法时必须给这些形参指定参数值,调用方法时传给形参的参数值也被称为实参. Java的实参值是如何传入方法?这是由Java方法的参数传递机制来控制的,Java ...

  7. 我的Java开发学习之旅------>Java经典排序算法之归并排序

    一.归并排序 归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用.将已有序的子序列合并,得到完全有序的序列:即先使每个子序列 ...

  8. 我的Java开发学习之旅------>Java经典排序算法之快速排序

    一.算法思想     快速排序是C.R.A.Hoare于1962年提出的一种划分交换排序.它采用了一种分治的策略,通常称其为分治法(Divide-and-ConquerMethod).(1) 分治法的 ...

  9. 我的Java开发学习之旅------>Java经典排序算法之二分插入排序

    一.折半插入排序(二分插入排序) 将直接插入排序中寻找A[i]的插入位置的方法改为采用折半比较,即可得到折半插入排序算法.在处理A[i]时,A[0]--A[i-1]已经按关键码值排好序.所谓折半比较, ...

随机推荐

  1. luogu P1608 路径统计

    题目描述 “RP餐厅”的员工素质就是不一般,在齐刷刷的算出同一个电话号码之后,就准备让HZH,TZY去送快餐了,他们将自己居住的城市画了一张地图,已知在他们的地图上,有N个地方,而且他们目前处在标注为 ...

  2. getServletConfig().getInitParameter("count1") java.lang.NullPointerException

    通常在doget中 System.out.println(getServletConfig()); System.out.println(getServletConfig().getInitParam ...

  3. tcp/ip RFC

     http://www.ietf.org/rfc.htmlhttp://www.rfc-editor.org

  4. 基于WPF系统框架设计(3)-Fluent Ribbon界面布局

    一个系统框架除了功能菜单导航,有系统内容显示区域,系统状态栏. Silver: Blue: Black: 系统界面设计,就不进行技术细节介绍了,主题以框架设计为主,Xaml源码参考: <Flue ...

  5. 【Objective-C Runtime动态加载】---动态创建类Class

    a.使用objc_allocateClassPair创建一个类Class    const char * className = "Calculator";    Class kc ...

  6. Caught exception while loading file struts-default.xml 的错误

    转自刘长炯的博客:http://www.blogjava.net/beansoft/archive/2008/10/13/233962.html MyEclipse 6开发JDK6和Struts 2冲 ...

  7. django 发送邮件设置

    http://blog.csdn.net/zy416548283/article/details/45058369 http://blog.csdn.net/viqecel/article/detai ...

  8. sublime的markdown插件

    mac安装 shift+command+p调出package control面板,搜索install调查安装软件搜索面板 搜索需要安装markdown软件 我安装了下面两个:MarkdownLiveP ...

  9. 【GLSL教程】(一)图形流水线 【转】

    http://blog.csdn.net/racehorse/article/details/6593719 这是一些列来自lighthouse3d的GLSL教程,非常适合入门.我将边学习边翻译该教程 ...

  10. Ubuntu 14.04 使用VirtualBox 4.3.10 虚拟 Windows 7

    Ubuntu 14.04 尽管不错,可是有些事仅仅能在Windows下才干完毕,所以在 Ubuntu 下利用虚拟机软件Oracle VirtualBox,虚拟安装个Windows系统是个不错的选择. ...