基本概念
在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在方法中引用时,在方法中值改变,不会影响到原始值
引用传递:对象在方法引用时,通过对应的引用指向的是同一个值,修改值会直接影响原始值
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。