java值传递详解

java的值传递详解

  1. 首先我们需要弄清楚基本数据类型和引用数据类型的区别
    int num = 0;
    String str = "java";
    基本数据类型直接保存在变量中,而引用数据类型保存在变量中的是地址值,地址指向实际对象,所以被称为引用数据类型。

    2. 再来弄清楚赋值运算符(=)的作用
    num = 20;
    str = "hello";
    基本数据类型直接修改变量中存储的数值,而应用数据类型是修改了变量中保存的地址,新地址指向所赋值的实际对象,原来的对象并没有改变。没有任何地址指向的对象就是垃圾会被java垃圾回收机制回收

    3. 值传递实际例子
    //第一个例子:基本类型
    void foo(int value) {
    value = 100;
    }
    foo(num); // num 没有被改变
    //第二个例子:没有提供改变自身方法的引用类型
    void foo(String text) {
    text = "windows";
    }
    foo(str); // str 也没有被改变
    //第三个例子:提供了改变自身方法的引用类型
    StringBuilder sb = new StringBuilder("iphone");
    void foo(StringBuilder builder) {
    builder.append("4");
    }
    foo(sb); // sb 被改变了,变成了"iphone4"。
    //第四个例子:提供了改变自身方法的引用类型,但是不使用,而是使用赋值运算符。
    StringBuilder sb = new StringBuilder("iphone");
    void foo(StringBuilder builder) {
    builder = new StringBuilder("ipad");
    }
    foo(sb); // sb 没有被改变,还是 "iphone"。
    第一个例子,对于基本数据类型来说,因为是值传递,将num的值赋给形参value,所以num并不会改变。
    第二个例子,对于引用数据类型来说,将str的地址赋值给text,函数中改变的是text的地址值,所以str没有变换。
    第三个例子,在函数中sb的地址赋值给形参builder,builder的地址没有变化,而实际对象"iphone"被修改成”iphone4“,所以sb地址指向的值从”iphone“变成了”iphone4“。


    第四个例子,在函数中sb的地址赋值给形参builder,而builder的地址发生变化,原来的实际对象i并没有发生改变,因此sb没有改变,依旧指向”iphone“。

posted @ 2020-05-10 07:33  GoodForNothing  阅读(616)  评论(0编辑  收藏  举报
//看板娘