Java是值传递还是引用传递

Java是值传递还是引用传递

一、概述

在 Java 语言中,本质只有值传递,而无引用传递。

二、值类型和引用类型

值类型就是Java 中的 8 大基础数据类型:

  • 整数型:byte、short、int、long
  • 浮点型:float、double
  • 字符类型:char
  • 布尔类型:boolean

所谓的值类型指的是在赋值时,直接在栈中(Java 虚拟机栈)生成值的类型。

引用类型是指除值类型之外的数据类型,比如:

  • 类、接口
  • 数组
  • 字符串
  • 包装类(Integer、Double…)

所谓的引用类型是指,在初始化时将引用生成栈上,而值生成在堆上的这些数据类型。

三、值传递和引用传递

1、值传递(Pass By Value)指的是方法传参时,传递的是原内容的副本,因此对副本进行如何修改都不会影响原内容。

public class PassValueTest {
    public static void main(String[] args) {
        int age = 18;
        System.out.println("调用方法before:" + age);
        intTest(age);
        System.out.println("调用方法after:" + age);
    }

    private static void intValueTest(int age) {
        age = 33;
        System.out.println("方法中修改:" + age);
    }
}
//运行结果///
调用方法before:18

方法中修改:33

调用方法after:18

在方法中修改参数并未影响原内容,我们把这种传参方式称之为值传递。

2、引用传递(Pass By Reference)指的是方法传参时,传递的是参数本身,因此对参数进行任意修改都会影响原内容。

/**“引用传递”*/
public class PassByReferenceValue {
    public static void main(String[] args) {
        char[] name = {'宇', '哥'};
        System.out.println("调用方法before:" + new String(name));
        paramReferenceTest(name);
        System.out.println("调用方法after:" + new String(name));
    }
    private static void paramReferenceTest(char[] n) {
         n[1] = '神';
        System.out.println("方法中修改为:" + new String(n));
    }
}

//运行结果///
调用方法before:宇哥

方法中修改为:宇神

调用方法after:宇神




public class PassByReferenceValue {
    public static void main(String[] args) {
        char[] name = {'宇', '哥'};
        System.out.println("调用方法before:" + new String(name));
        paramReferenceTest(name);
        System.out.println("调用方法after:" + new String(name));
    }
    private static void paramReferenceTest(char[] n) {
        n = new char[2]; // 添加此行代码
        n[1] = '神';
        System.out.println("方法中修改为:" + new String(n));
    }
}

//运行结果///
调用方法before:宇哥

方法中修改为:神

调用方法after:宇哥

当我们在 paramReferenceTest方法中添加 new char[] 之后,“引用传递”就突然变值传递了?为什么?

这是因为,在 Java 语言中本质上只有值传递,也就说 Java 的传参只会传递它的副本,并不会传递参数本身。

前面那个带引号的“引用传递”其实只是传递了它的引用副本,

四、总结;

在 Java 语言中只有值传递,方法传参时只会传递副本信息而非原内容。我们还知道了基础数据类型会直接生成到栈上,而对象或数组则会在栈和堆上都生成信息,并将栈上生成的引用,直接指向堆中生成的数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值