理解String不可变
2015-06-06 11:10
337 查看
问题的引入:
java中只有值传递,没有引用传递,这里有两种情况,一种是传对象,一种是传基础类型,传对象其实是传对象的引用,
http://guhanjie.iteye.com/blog/1683637这篇文章描述了一些情况:
基础类型传递的时候,直接把内存里面真正的值传递过去,而在对象传递的时候,是把对象的引用传递过去。
那么问题来了,为什么String作为对象,再方法调用的时候却跟基础类型调用的效果是一样的。
给出代码:
public class Example {
String str = new String("good");
char[] ch = { 'a', 'b', 'c' };
public static void main(String args[]) {
Example ex = new Example();
ex.change(ex.str, ex.ch);
System.out.print(ex.str + " and ");
System.out.print(ex.ch);
}
public void change(String str, char ch[]) {
str="test ok";
ch[0] = 'g';
}
}
这里输出:good and gbc
本例中,str和ch作为对象一起传入方法change,也一同改变,ch变化了,str并没有改变。
解释:
1,如果你看到这里了,那么你应该理解了java中总是值传递(传对象的时候,对象的地址就是他的值)。
2,String是不可变的对象,为什么这么说呢,我们看String的源码可以知道:String是final的,String的成员变量也是final的,首先String实例化出来是不可变的(除非反射)。当我们尝试改变他的时候:
str="test ok";
其实是在内存空间再创建一个"test ok"的对象,并把str引用指向这个新创建的对象,原来的ex.str引用依旧指向了之前的"good"对象的地址。
3,我们要区别对待String,想想看,为什么会引入这样的问题,其实是因为String作为对象却可以跟基础类型数据一样使用+,=等操作。这在语言中本身就已经对String做了特殊的处理。
java为String对象重载"+",这里的重载是,一个操作符在应用于特定的类时,被赋予了特殊的意义(用于String的"+"和"+="是Java仅有的两个重载过的操作符,而java并不允许程序员重载任何操作符)
http://blog.csdn.net/clam_clam/article/details/6831345
思考:延续第三点,我们能不能创建一个类似String的对象,即也是final,其成员变量都是final的,然后作为对象传递,在方法体类改变而不影响其原本的值。
java中只有值传递,没有引用传递,这里有两种情况,一种是传对象,一种是传基础类型,传对象其实是传对象的引用,
http://guhanjie.iteye.com/blog/1683637这篇文章描述了一些情况:
基础类型传递的时候,直接把内存里面真正的值传递过去,而在对象传递的时候,是把对象的引用传递过去。
那么问题来了,为什么String作为对象,再方法调用的时候却跟基础类型调用的效果是一样的。
给出代码:
public class Example {
String str = new String("good");
char[] ch = { 'a', 'b', 'c' };
public static void main(String args[]) {
Example ex = new Example();
ex.change(ex.str, ex.ch);
System.out.print(ex.str + " and ");
System.out.print(ex.ch);
}
public void change(String str, char ch[]) {
str="test ok";
ch[0] = 'g';
}
}
这里输出:good and gbc
本例中,str和ch作为对象一起传入方法change,也一同改变,ch变化了,str并没有改变。
解释:
1,如果你看到这里了,那么你应该理解了java中总是值传递(传对象的时候,对象的地址就是他的值)。
2,String是不可变的对象,为什么这么说呢,我们看String的源码可以知道:String是final的,String的成员变量也是final的,首先String实例化出来是不可变的(除非反射)。当我们尝试改变他的时候:
str="test ok";
其实是在内存空间再创建一个"test ok"的对象,并把str引用指向这个新创建的对象,原来的ex.str引用依旧指向了之前的"good"对象的地址。
3,我们要区别对待String,想想看,为什么会引入这样的问题,其实是因为String作为对象却可以跟基础类型数据一样使用+,=等操作。这在语言中本身就已经对String做了特殊的处理。
java为String对象重载"+",这里的重载是,一个操作符在应用于特定的类时,被赋予了特殊的意义(用于String的"+"和"+="是Java仅有的两个重载过的操作符,而java并不允许程序员重载任何操作符)
http://blog.csdn.net/clam_clam/article/details/6831345
思考:延续第三点,我们能不能创建一个类似String的对象,即也是final,其成员变量都是final的,然后作为对象传递,在方法体类改变而不影响其原本的值。
相关文章推荐
- CSS Padding(填充)
- pom.xml第一行报错
- UIImage基础语法
- 软件概要设计与详细设计的区别
- 将CorelDRAW文件转成PSD分层文件详解
- 【转】 linux内核移植和驱动添加(三)
- JavaScript中String.match()方法的使用详解
- DEV C++使用说明
- setRestoreOriginalFrame
- 《机器学习实战》-朴素贝叶斯笔记
- LightOJ1011---Marriage Ceremonies (状压dp)
- surface pro 3系统运行中关闭fn功能键
- 程序员修炼之路
- ZigBee之无线射频程序解析
- 图片压缩问题
- Qt4.8.6与VS2008的集成开发环境的安装配置
- php函数—preg_quote()转义正则表达式字符
- 6.函数的参数
- 容器适配器之queue
- CSS Margin(外边距)