我的Java开发学习之旅------>Java String对象作为参数传递的问题解惑
又是一道面试题,来测试你的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对象作为参数传递的问题解惑的更多相关文章
- 我的Java开发学习之旅------>Java 格式化类(java.util.Formatter)基本用法
本文参考: http://docs.oracle.com/javase/1.5.0/docs/api/java/util/Formatter.html http://www.blogjava.net/ ...
- 我的Java开发学习之旅------>Java使用Fork/Join框架来并行执行任务
现代的计算机已经向多CPU方向发展,即使是普通的PC,甚至现在的智能手机.多核处理器已被广泛应用.在未来,处理器的核心数将会发展的越来越多. 虽然硬件上的多核CPU已经十分成熟,但是很多应用程序并未这 ...
- 我的Java开发学习之旅------>Java NIO 报java.nio.charset.MalformedInputException: Input length = 1异常
今天在使用Java NIO的Channel和Buffer进行文件操作时候,报了java.nio.charset.MalformedInputException: Input length = 1异常, ...
- 我的Java开发学习之旅------>Java使用ObjectOutputStream和ObjectInputStream序列号对象报java.io.EOFException异常的解决方法
今天用ObjectOutputStream和ObjectInputStream进行对象序列化话操作的时候,报了java.io.EOFException异常. 异常代码如下: java.io.EOFEx ...
- 我的Java开发学习之旅------>Java利用Comparator接口对多个排序条件进行处理
一需求 二实现Comparator接口 三验证排序结果 验证第一条件首先按级别排序级别最高的排在前面 验证第二条如果级别相等那么按工资排序工资高的排在前面 验证第三条如果工资相当则按入职年数排序入职时 ...
- 我的Java开发学习之旅------>Java语言中方法的参数传递机制
实参:如果声明方法时包含来了形参声明,则调用方法时必须给这些形参指定参数值,调用方法时传给形参的参数值也被称为实参. Java的实参值是如何传入方法?这是由Java方法的参数传递机制来控制的,Java ...
- 我的Java开发学习之旅------>Java经典排序算法之归并排序
一.归并排序 归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用.将已有序的子序列合并,得到完全有序的序列:即先使每个子序列 ...
- 我的Java开发学习之旅------>Java经典排序算法之快速排序
一.算法思想 快速排序是C.R.A.Hoare于1962年提出的一种划分交换排序.它采用了一种分治的策略,通常称其为分治法(Divide-and-ConquerMethod).(1) 分治法的 ...
- 我的Java开发学习之旅------>Java经典排序算法之二分插入排序
一.折半插入排序(二分插入排序) 将直接插入排序中寻找A[i]的插入位置的方法改为采用折半比较,即可得到折半插入排序算法.在处理A[i]时,A[0]--A[i-1]已经按关键码值排好序.所谓折半比较, ...
随机推荐
- luogu P1608 路径统计
题目描述 “RP餐厅”的员工素质就是不一般,在齐刷刷的算出同一个电话号码之后,就准备让HZH,TZY去送快餐了,他们将自己居住的城市画了一张地图,已知在他们的地图上,有N个地方,而且他们目前处在标注为 ...
- getServletConfig().getInitParameter("count1") java.lang.NullPointerException
通常在doget中 System.out.println(getServletConfig()); System.out.println(getServletConfig().getInitParam ...
- tcp/ip RFC
http://www.ietf.org/rfc.htmlhttp://www.rfc-editor.org
- 基于WPF系统框架设计(3)-Fluent Ribbon界面布局
一个系统框架除了功能菜单导航,有系统内容显示区域,系统状态栏. Silver: Blue: Black: 系统界面设计,就不进行技术细节介绍了,主题以框架设计为主,Xaml源码参考: <Flue ...
- 【Objective-C Runtime动态加载】---动态创建类Class
a.使用objc_allocateClassPair创建一个类Class const char * className = "Calculator"; Class kc ...
- Caught exception while loading file struts-default.xml 的错误
转自刘长炯的博客:http://www.blogjava.net/beansoft/archive/2008/10/13/233962.html MyEclipse 6开发JDK6和Struts 2冲 ...
- django 发送邮件设置
http://blog.csdn.net/zy416548283/article/details/45058369 http://blog.csdn.net/viqecel/article/detai ...
- sublime的markdown插件
mac安装 shift+command+p调出package control面板,搜索install调查安装软件搜索面板 搜索需要安装markdown软件 我安装了下面两个:MarkdownLiveP ...
- 【GLSL教程】(一)图形流水线 【转】
http://blog.csdn.net/racehorse/article/details/6593719 这是一些列来自lighthouse3d的GLSL教程,非常适合入门.我将边学习边翻译该教程 ...
- Ubuntu 14.04 使用VirtualBox 4.3.10 虚拟 Windows 7
Ubuntu 14.04 尽管不错,可是有些事仅仅能在Windows下才干完毕,所以在 Ubuntu 下利用虚拟机软件Oracle VirtualBox,虚拟安装个Windows系统是个不错的选择. ...