请先看第一段代码
String []name3 = new String[]{"james","jerry"};
String []name4 = new String[2];
name4 = name3;
name4[0] = "lucy";
for(int i=0;i<name3.length;i++){
System.out.print(name3[i]+"\t");
}
输出结果 lucy jerry 我修改第二个数组的首位元素第一个数组的首位元素也跟着改变了第二段代码
String name1 = new String("james");
String name2 = new String();
name2 = name1;
name2 = "lucy";
System.out.println(name1);
输出结果 james我的问题是同样是引用数据类型为什么name3[0]的值就跟着变了,而name1的值没变呢?
String []name3 = new String[]{"james","jerry"};
String []name4 = new String[2];
name4 = name3;
name4[0] = "lucy";
for(int i=0;i<name3.length;i++){
System.out.print(name3[i]+"\t");
}
输出结果 lucy jerry 我修改第二个数组的首位元素第一个数组的首位元素也跟着改变了第二段代码
String name1 = new String("james");
String name2 = new String();
name2 = name1;
name2 = "lucy";
System.out.println(name1);
输出结果 james我的问题是同样是引用数据类型为什么name3[0]的值就跟着变了,而name1的值没变呢?
解决方案 »
- 从keystore file里读取信息
- 请教GIS最短路径输出。。。。。
- java中 一个 构造 函数如何 调用 令外 一个 构造 函数
- 急求:请大家给我推荐关于JAVA编程的书籍
- 请问在Filter中,怎么重定向。。。急。。。。
- 想替换路径中的"\"为"/" 执行一直出错path.replaceAll("\\","/");
- 关于一个有点怪的编译,执行问题(应用程序)
- ==========>>>>>>散分中,这是怎么一回事啊?????
- java在linux得安装问题 在线等 谢谢
- 如何解决Tomcat4 与MS SQLServer 2000的连接问题?
- paint()和paintComponent的问题
- JAVA 多线程的 问题、
接下来name2="lucy",因为String是不可变类,实际上堆区的空字符串对象没有改变,JVM在堆区重新创建的一个String对象内容是lucy并让name2的获得其引用,而name1的引用还是指向原来的内存地址(空字符串)
因此name2="lucy"因为重新开了一个String对象,name2值变化,而name1的引用对象没有销毁,还是原来的空值
并且因为是数组地址的引用,两者元素的指向会保持同步,不会像String类型一样会指向不同地方
不是将name3里的元素考到name4中
而是将name4这个引用也指向name3指向的对象数组
你如果做
name4 = name3
上面一行的new String[2]可以省略
首先 name3 指向----->name3[0]与name3[1]又是一个引用,而 name4指向--------->name4[0],name4[1]两个引用。
通过赋值后 ,name4----->name3[0]与name3[1],name4就不能指向>name4[0],name4[1]这连个两个引用了。
因此name4[0]与name3[1]实际就是一个引用了。name4[0]与name3[0] 实际上是同一个内存单元。而在第二个中name1 与name2 的引用占用的两个不同的内存地址。
name2中 每创建一个一个对象 或者赋值一个引用 他的值都会变化 。而name1中一直没得改变。