Java String类 传参的问题
2016-07-08 16:39
417 查看
疑问来自于这段代码
输出值是"1234"。
为什么?Java里对象传参不是引用传递吗?为什么str没有变么?
上网查找了下相关博客,找到一篇极好的:
http://freej.blog.51cto.com/235241/168676
总结下博客里的关于这个问题的精简回答:
String 内部实现使用char[],类似于Integer是int的包装类,Float是float的包装类一样,包装类在传参数时会体现基本类型的性质(所以包装类传参时不仅是String,而是都会有通过引用修改对象,但出了函数体后,对象并没有修改成功的问题)
再往深挖,包装类传参为什么体现基本类型的性质?
这是因为基本类型和包装类型都有以下特征:
所有实例都是只读的,也就是说包装类中对实际的value没有setter方法,其包装类所有方法都无法修改实际的value本身,而是通过方法修改返回一个新的value,这就导致每一次赋值,其实都是创建了一个新实例。
此外,用基本类型对包装类赋值,同样会导致创建一个新的实例。
这样的话,也就是新的实例保存了在函数中更改后的值,这样,跳出局部函数之后,局部变量出栈,原先传入的参数其实是没有改变的。
public class Test1 { public static void changeStr(String str) { str = "welcome"; } public static void main(String[] args) { String str = "1234"; changeStr(str); System.out.println(str); } }
输出值是"1234"。
为什么?Java里对象传参不是引用传递吗?为什么str没有变么?
上网查找了下相关博客,找到一篇极好的:
http://freej.blog.51cto.com/235241/168676
总结下博客里的关于这个问题的精简回答:
String 内部实现使用char[],类似于Integer是int的包装类,Float是float的包装类一样,包装类在传参数时会体现基本类型的性质(所以包装类传参时不仅是String,而是都会有通过引用修改对象,但出了函数体后,对象并没有修改成功的问题)
再往深挖,包装类传参为什么体现基本类型的性质?
这是因为基本类型和包装类型都有以下特征:
所有实例都是只读的,也就是说包装类中对实际的value没有setter方法,其包装类所有方法都无法修改实际的value本身,而是通过方法修改返回一个新的value,这就导致每一次赋值,其实都是创建了一个新实例。
此外,用基本类型对包装类赋值,同样会导致创建一个新的实例。
这样的话,也就是新的实例保存了在函数中更改后的值,这样,跳出局部函数之后,局部变量出栈,原先传入的参数其实是没有改变的。
相关文章推荐
- Java文件目录操作
- Java NIO使用及原理分析(三)
- ArrayList输出的几种方法
- Java - 数据库 - (mysql -2)
- Spring 之 JdbcTemplate
- java生成xml格式文件的方法
- 深入理解Java虚拟机-虚拟机性能监控与故障处理工具
- 深入理解Spring事务原理
- Java链式异常
- 浅谈Java设计模式(三)单例模式(Singleton)
- CharsetUtils.java
- MySQL Connectors Java下载及使用
- 【奔跑的菜鸟】第一个Java程序
- Java NIO使用及原理分析(二)
- 单变量求解的Java实现及其与Excel的Goal Seek性能比较(Java完胜)
- There is an error in invoking javac. A full JDK (not just JRE) is required问题解决
- Struts2数据传输的背后机制:ValueStack(值栈)
- SpringMVC+MyBatis声明式事务管理
- 在IntelliJ IDEA上将WSDL生成Java代码
- JAVA POI关闭Workbook