美文网首页
String作为引用类型,为什么在主方法内调用子方法,子方法修改

String作为引用类型,为什么在主方法内调用子方法,子方法修改

作者: 蜗牛写java | 来源:发表于2020-04-18 17:57 被阅读0次

    String作为引用类型,为什么在主方法内调用子方法,子方法修改不了String的值

    有趣的小例子

    public class StringTest {
    
       public static void main(String[] args) {
           String str = new String("0");
           System.out.println("+主方法调用子方法前 str = :" + str);
           resetString(str);
           //该处直接上,是不是应该输出 change
           System.out.println("+主方法调用子方法后 str = :" + str);
    
        }
    
        private static void resetString(String str) {
           System.out.println("    -子方法中改变前 str = :" + str);
           str = "change";
           System.out.println("    -子方法中改变后 str = :" + str);
        }
    }
    

    真实的输出结果

    +主方法调用子方法前 str = :0
    -子方法中改变前 str = :0
    -子方法中改变后 str = :change
    +主方法调用子方法后 str = :0

    子方法没有起到重置str的作用

    因为 String 为 final 修饰的类,所以创建的对象不能改变;str引用变量重新赋值,其实是在堆中是重新创建了一个实例对象,子方法中str引用变量指向了新的实例对象;

    public class StringTest {
    
       public static void main(String[] args) {
           //1 主方法栈帧 中创建 str 引用变量;堆中创建 Stirng 为 0 的对象
           String str = new String("0");
           System.out.println("+主方法调用子方法前 str = :" + str);
           //2 调用子方法
           resetString(str);
           //由 1 2 执行步骤,可以看出 主方法栈帧中的 str引用对象指向的 0 对象没有发生改变
           System.out.println("+主方法调用子方法后 str = :" + str);
    
        }
    
        //2.1 主方法栈帧中 压人 子方法栈帧
        private static void resetString(String str) {
           System.out.println("    -子方法中改变前 str = :" + str);
           //2.2 堆中创建 change 对象;子方法栈帧中 str引用变量 执行堆中新创建的 change对象
           str = "change";
           System.out.println("    -子方法中改变后 str = :" + str);
        }
    }
    

    图示如下:

    栈帧和堆.png

    相关文章

      网友评论

          本文标题:String作为引用类型,为什么在主方法内调用子方法,子方法修改

          本文链接:https://www.haomeiwen.com/subject/bvswvhtx.html