对于引用类型,我们往往出现理解上的错误,甚至某些教材编写者也是一样,往往片面的将引用类型与同类型的两个变量引用同一个实例等同起来,最近我看了本书,是清华大学出版社出版的Java从入门到精通,其中有关于String 类型一段的描述如下:
String str1,str2;
str1="We are students";
str2="We are students";
同时内存示意图上显示 str1与str2指向了同一个字符串"We are students",
此处出现的明显错误对于老C系列程序员而言,可以轻易纠正,但对于初学者而言,这无疑是误人子弟,我们在定义引用类型与值类型的时候,基本上是继承了原来的c系列语言中对于内存寻址的概念,如果该地址存放的是地址,则为引用,而如果该地址存放的是操作数,则为值类型。而String 类型比较特殊,它在每次进行构造的时候都会产生一个新的字符数组,并且自动丢弃原来的字符数组,因此,str1与str2实际上并非同一个实例,他们是两个不同的实例,改变其中一个,并不会联动使得另外一个发生改变。
而如果我们采用
String str1,str2;
str1=str2="We are students";
这种方式赋值,我们同样会得到一个表面的结果——str1与str2指向的不是同一个实例,其实这是一种误区,我们采用这种方式赋值的时候,其实两个字符串变量指向的确实是同一个字符数组地址,但是为什么会在改变其中一个的时候,另外一个不会发生改变呢?这还是因为字符串的特殊性,他在构造的时候总是产生一个新的字符数组,我们如果改变了其中一个字符串变量的值,其实他的地址已经与另外一个不一样了,他会指向一个新的字符数组地址,而原来的那个却没有发生改变,所以,会有这种表面现象使得我们误以为字符串类型是属于值类型。总的来说,String类型是一个具有值类型特性的引用数据类型。
String str1,str2;
str1="We are students";
str2="We are students";
同时内存示意图上显示 str1与str2指向了同一个字符串"We are students",
此处出现的明显错误对于老C系列程序员而言,可以轻易纠正,但对于初学者而言,这无疑是误人子弟,我们在定义引用类型与值类型的时候,基本上是继承了原来的c系列语言中对于内存寻址的概念,如果该地址存放的是地址,则为引用,而如果该地址存放的是操作数,则为值类型。而String 类型比较特殊,它在每次进行构造的时候都会产生一个新的字符数组,并且自动丢弃原来的字符数组,因此,str1与str2实际上并非同一个实例,他们是两个不同的实例,改变其中一个,并不会联动使得另外一个发生改变。
而如果我们采用
String str1,str2;
str1=str2="We are students";
这种方式赋值,我们同样会得到一个表面的结果——str1与str2指向的不是同一个实例,其实这是一种误区,我们采用这种方式赋值的时候,其实两个字符串变量指向的确实是同一个字符数组地址,但是为什么会在改变其中一个的时候,另外一个不会发生改变呢?这还是因为字符串的特殊性,他在构造的时候总是产生一个新的字符数组,我们如果改变了其中一个字符串变量的值,其实他的地址已经与另外一个不一样了,他会指向一个新的字符数组地址,而原来的那个却没有发生改变,所以,会有这种表面现象使得我们误以为字符串类型是属于值类型。总的来说,String类型是一个具有值类型特性的引用数据类型。
解决方案 »
- 救火啊!时间比较紧!
- ibatis疑问
- java 图像识别
- oracle查找日期问题(酒店check-in)系统
- 看看我hql时间比较哪里有问题?
- 一个hibernate(OpenSessionInViewFilter)的删除问题,急! 在线等
- sql操作写在servlet中合不合适,有人推荐我全部写在bean中,但是习惯原因serlet不怎么调用bean
- 连JDBC时出的奇怪问题,大虾们帮一把阿
- 用Struts调用EJB的错误?请大家帮我分析一下!!问题解决后,再送200分!!
- 对一个实体EJB设置了ejb-ref/ejb-local-ref后有什么用?
- strut1的问题,显示不了数据
- java http下载,产生connection或者io异常该怎么处理?让它跳转错误页面.
public static void main(String[] args){
String a,b;
a="cc";
String d="dd";
b="cc";
System.out.println(a==b);
}
运行输出结果应该为true.而如果
public static void main(String[] args){
String a,b;
a=b="cc";
b="dd";
System.out.println(a==b);
}
运行输出结果为false。
public static void main(String[] args){
String a,b;
a="cc";
String d="dd";
b="cc";
System.out.println(a==b);
}
变量a和b的值相同都是"cc"肯定相等啦!2:
public static void main(String[] args){
String a,b;
a=b="cc";
b="dd";
System.out.println(a==b);
}
变量a值是"cc"; b是"d" 这怎么可能是true呢??
String a=new String ("cc");
String b=new String ("cc");
那么a==b只能返回false,而不是true。
第二个问题是你眼花了呵呵,最后一句话是false.
而String没有封装类,却可以使用对象操作方法,length(),substring()...
String却又总给人基本类型的假象,就像楼主说的具有基本类型特性的引用类型
测试一个应用类型数据很容易
int[] a={1,2,3};
int[] b=a;
a[2]=110;
System.out.println(b[2]);
输出结构:110
但是一个String类型怎么明显的测试特使引用类型,暂时还没有方法
楼主有什么思想吗,讨论下