基本概念

在java中,数据类型可以分为两类:基本数据类型和引用数据类型(对象)
基本数据类型存储在栈中,引用数据类型存储在堆中,引用数据类型的地址引用存储在栈中。
作为参数传递时,会将参数复制一份,保存在方法栈中,给方法使用

基本数据类型包括:byte, short, int, long, char, float, double, boolean。基本数据类型在传递时会进行值拷贝,即值传递。
引用数据类型包括:类、接口、数组等。这些类型在传递时传递的是对象的引用,即引用传递

差异

值传递:将参数的值进行了复制,并进行传递,修改了变量的值不会影响到原始对象
引用传递:是将引用对象的地址引用进行了复制,修改了变量的值会直接影响到堆中存储的值,会影响到原始对象

代码示例

public static void main(String[] args){
    int a = 10;
    passByValue(a);
    System.out.println("a = " + a); // 10

    StringBuilder b = new StringBuilder("我是一个初始化字符串!");
    passByReference(b);
    System.out.println("b = " + b); // 我是一个初始化字符串!我是追加的字符串!

    Integer c = 10;
    passByValue2(c);
    System.out.println("c = " + c); // 10

    String d = "我是一个初始化字符串!";
    passByReference2(d);
    System.out.println("d = " + d); // 我是一个初始化字符串!

}

// 值传递:在方法传递过程中,会把值进行copy,在方法中修改参数值不会影响到原始值
// 基本数据类型:byte short int long boolean char float doubble;对应包装类Byte Short Integer Long  Boolean Character Float Doubble
public static void passByValue(int a){
    a = 20;
}

// 基本数据类型的包装类,本身是引用传递,但是final修饰,也可以归类为一种特殊的基本数据类型
public static void passByValue2(Integer a){
    a = 20;
}

// 引用传递:在方法传递过程中,传递的是对应的引用地址,在方法中修改参数对象会影响到原始对象
public static void passByReference(StringBuilder b){
    b.append("我是追加的字符串!") ;
}

// String 本身是引用传递,但是final修饰,也可以归类为一种特殊的基本数据类型
// 引用时,会把原始对象的引用,复制一份给到b,然后b又在池中新增了一个对象"我是追加的字符串!",b指向新创建的对象,原始对象的引用与值都没有发生改变,所以不会影响到原始值
public static void passByReference2(String b){
    b = "我是追加的字符串!" ;
}

总结
值传递:基本数据类型、包装类、String在方法中引用时,在方法中值改变,不会影响到原始值
引用传递:对象在方法引用时,通过对应的引用指向的是同一个值,修改值会直接影响原始值


wasdquiop
7 声望4 粉丝