main方法中的对象被调用的类new了一下,为什么值没变

public static void main(String[] args) {
    List list = new ArrayList<>();
    String str = "1";
    list.add("a");
    operate(list, str);
    for (String s : list) {
        System.out.println(s);
    }
    System.out.println(str);
}

public static void operate(List list, String str) {
    str.replace("1", "2");
    list.add("b");
    list = new ArrayList<>();
    list.add("c");
}

输出结果是 a b 1

1、首先来解释下str的值为何为1

原因:虽然str调用了替换方法但是并没有把这个值赋给str

那有人会说 把代码 str.replace("1", "2");改成 str=str.replace("1", "2")不就行了,其实也是错误的,这个原因下面我会做解释

2、for循环中list的值为何[a,b]

原因:在类中new出来的list数组对象分配了一个新的内存空间,但是它在类方法结束的时候就被自动回收了,所以for循环中的list调用的依然是main中的list对象,而b之所以被添加到main中的list,是因为它在回收之前就已经添加到了main中的list,上面说到的即使在operate类中str被改成改成 str=str.replace("1", "2"),依然输出1 也是这个原因

除了这两个原因,还有一个重要的原因就是operate类中list数组对象并没有被返回,也就是我们说的retur

 如果想将main中的list对象指向operate类中的l新创建的ist数组对象,除了满足return条件外,在主方法中还要赋值才行,

     如在主方法中list对象数组要接收operate类中的list对象

public static void main(String[] args) {
    List list = new ArrayList<>();
    list.add("a");
    list=operate(list);
    System.out.println(list);
}

public static List  operate(List list) {
    list.add("b");
    list = new ArrayList<>();
    list.add("c");
    return list;
}

 

 

总结: 此段代码考察的我认为还是有关jvm的知识点,也就是堆栈,还有垃圾回收机制

 本人知识尚缺,如有错误,请一定要指出。

 

 

 

 

 

 

你可能感兴趣的:(jvm,随笔)