本帖最后由 魏-玉-彪 于 2013-11-10 13:40 编辑
- /**
- *
- * 为什么int类型和String类型的变量经过方法处理后值没变,而List类型的变量值却变了?
- */
- public class Test {
-
- public int addInt(int i) {
- return i += 1;
- }
-
- //public void addInt(int i) { //首先这里没有返回值
- // i += 1;
- //}
- public void addStr(String str) {
-
- str+="111"; };
- public void addList(List<String> strList) {
- strList.add("List111");
- }
- public static void main(String[] args) {
- int i = 0;
- String str = "s";
-
- List <String> strList = new ArrayList<String>();
- Test t = new Test();
- //t.addInt(i);
- //t.addStr(str); 因为没有反回值 所以这里是多余的,
-
- //假如有返回值,需要调用 对象的方法才有.
- System.out.println( t.addInt(i));
- System.out.println(i); // 输出0,为什么不是1
- System.out.println(str); // 输出s;为什么不是s111
- /*事实上,这里输出的是main方法中的变量
- 因为对象中没有返回值,所以值没有变.而且字符串对象一经创建就不会改变,
- 除非引用地址改变,而这里的引用地址并没有改变
- */
-
- t.addList(strList);
- System.out.println(strList.get(0)); // 输出List111,为什么就是这个可以
- //这里ArrayList虽然和String都是引用类型数据,但不同的时,对其操作不会产生新的对象,所以
- //处理的是一个对象,不用返回值,仍然影响了ArrayList对象本身.
- }
- }
复制代码
字符串一经创建就不会改变
举例 String s= "abc"; s的地址是 0X000002;
s=s+"def"; 对不起,这时s的地址指向了新的地址也许是0X007782而 不再是 0X000002
s+"def" 的意思是, 从s地址0X000002找一个 "abc",从"def" 的地址假如是0X999008 找一个"def" 这时,
s地址仍是 0X000002; "def"地址仍是0X999008
ArrayList 不同,假如ArrayList as其地址是 0X8888,
as.add("List111") 后,
as其地址仍然是是 0X8888, 所以,不用返回值,仍然改变了其中的内容,而地址没变
|