Java 值传递 引用传递

基本数据类型为值传递

代码举例

public class JavaTest {

    public void changeBasicDataTypeValue(int i) {
        i = 2;
        System.out.println(i);
    }

    public static void main(String[] args) {
        JavaTest javaTest = new JavaTest();
        
        int i = 1;
        
        System.out.println("原始值");
        System.out.println(i);

        System.out.println("函数修改值");
        javaTest.changeBasicDataTypeValue(i);

        System.out.println("函数修改后mian中的值");
        System.out.println(i);

    }

}

结果输出

原始值
1
函数修改值
2
函数修改后mian中的值
1

解释

在这里插入图片描述
  在mian函数中的int i为基本数据变量,所以是存储在mian栈帧的局部变量表中
  在changeBasicDataTypeValue函数中的参数i也为基本数据变量,所以也存储在changeBasicDataTypeValue栈帧中,changeBasicDataTypeValue函数中将i赋值为2的操作对象为changeBasicDataTypeValue函数栈帧局部变量表的i对main函数栈帧局部变量表中的i没有影响

8大基本数据类型

public class JavaTest {

    public void changeBasicDataTypeValue(byte b, short s, int i, long l, float f, double d, char c, boolean bool) {
        b = 0;
        s = 0;
        i = 0;
        l = 0;
        f = 0.0F;
        d = 0.0;
        c = '0';
        bool = false;

        System.out.println("byte:" + b + "-" + "short:" + s + "-" + "int:" + i + "-" + "long:" + l + "float:" + f
                + "-" + "double:" + d + "char:" + c + "_" + "boolean:" + bool);
    }

    public static void main(String[] args) {

        JavaTest javaTest = new JavaTest();

        byte b = 1;
        short s = 1;
        int i = 1;
        long l = 1;
        float f = 1.0F;
        double d = 1.0;
        char c = '1';
        boolean bool = true;

        System.out.println("原始值");
        System.out.println("byte:" + b + "-" + "short:" + s + "-" + "int:" + i + "-" + "long:" + l + "float:" + f
                + "-" + "double:" + d + "char:" + c + "_" + "boolean:" + bool);

        System.out.println("函数修改值");
        javaTest.changeBasicDataTypeValue(b, s, i, l, f, d, c, bool);

        System.out.println("函数修改后mian中的值");
        System.out.println("byte:" + b + "-" + "short:" + s + "-" + "int:" + i + "-" + "long:" + l + "float:" + f
                + "-" + "double:" + d + "char:" + c + "_" + "boolean:" + bool);

    }

}

输出

原始值
byte:1-short:1-int:1-long:1float:1.0-double:1.0char:1_boolean:true
函数修改值
byte:0-short:0-int:0-long:0float:0.0-double:0.0char:0_boolean:false
函数修改后mian中的值
byte:1-short:1-int:1-long:1float:1.0-double:1.0char:1_boolean:true

非基本数据类型为引用传递

代码举例

class User {
    String name;

    public User(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                '}';
    }
}

public class JavaTest {

    public void changeUserName(User tempUser) {
        tempUser.name = "change";
        System.out.println(tempUser);
    }

    public static void main(String[] args) {
        JavaTest javaTest = new JavaTest();

        User user = new User("name");

        System.out.println("原始值");
        System.out.println(user);

        System.out.println("函数修改值");
        javaTest.changeUserName(user);

        System.out.println("函数修改后mian中的值");
        System.out.println(user);

    }

}

结果输出

原始值
User{name='name'}
函数修改值
User{name='change'}
函数修改后mian中的值
User{name='change'}

解释

在这里插入图片描述
mian函数栈帧的user和changeUserName函数栈帧的tempUser都是指向堆中User实例对象的引用,changeUserName函数修改User的name属性,实际上修改的是堆中实例对象,而main函数局部变量表中user还是为堆中该对象。所以值改变了。

String

代码举例

public class JavaTest {

    public void changeString(String str) {
        str = "changeStr";
        System.out.println(str);
    }

    public static void main(String[] args) {
        JavaTest javaTest = new JavaTest();

        String str = "mainStr";

        System.out.println("原始值");
        System.out.println(str);

        System.out.println("函数修改值");
        javaTest.changeString(str);

        System.out.println("函数修改后mian中的值");
        System.out.println(str);

    }

}

结果输出

原始值
mainStr
函数修改值
changeStr
函数修改后mian中的值
mainStr

解释

个人理解为:String的s = “str"其实是在字符串常量池中创建一个"str"对象,然后s为指向"str”,是创建了一个字符串s,而不是将是s赋值为"str"
changeString()执行str = “changeStr”;前
在这里插入图片描述
changeString()执行str = “changeStr”;后
在这里插入图片描述
可以看到在执行后mian函数中的str指向的还是"mainStr"而changeString函数的str在运行时创建了一个新的字符串并将str指向新的字符串。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值