大家好,我是教授.F
基本数据类型和引用类型的传参机制是不同的,前者传递的是值(值拷贝),不会影响实参:后者传递的是地址,会影响实参的值。
本质上,区别就在于在堆创建还是在栈创建内存。
基本数据类型的内存只在栈中,引用数据类型在堆中有地址。
实例:
public class MethodParameter01{
public static void main(String[] args){
int a = 10;
int b = 20;
AA object = new AA();//执行完在堆有一个地址
object.swap(a,b); //产生新栈
System.out.println("a=" + a + "b=" + b);
}
}
class AA{
public void swap(int a,int b){
System.out.println("\na和b交换前的值\na=" + a + "\tb=" + b);
int temp = a;
a = b;
b = temp;
System.out.println("\na和b交换后的值\na=" + a + "\tb=" + b);
}
}
main栈先创建成功,基本数据类型,就会直接在main方法中有地址,然后new AA类出来,在堆中直接创建地址。执行object.swap(a,b); 语句后,会产生一个于main方法没有交际的栈,用来存放
int a、int b 和 int temp 的值。因为swap的栈于main方法的栈不同,所以a与b改变之后并不会改变main中的值。所以基本数据类型不会影响到实参的值。
补充:在 Java 中,栈内存主要用于存储方法调用和局部变量。当你在方法中声明一个局部变量时,该变量的值会被存储在栈内存中。这些局部变量可以是基本数据类型(如int、float、boolean等)或者对象引用。
对于引用类型创建,创建时在堆中会有地址。
就算调用类中的方法,产生的栈存放的也只是指向堆中的地址。
实例:
用类型传递的是地址(传递也是值但是值是地址),可以通过形参影响实参
类也是引用类型
public class MethodParameter02{
public static void main(String[] args){
B b = new B();//在堆创建一个对象
int[] arr = {1,2,3};//一引用型类型,在堆有空间
b.text100(arr);
System.out.println("main中的数组");
for(int i = 0;i < arr.length;i++){
System.out.prinit(arr[i] + "\t");
}
}
}
class B{//这里的arr也指向堆中的arr地址
public void text100(int[] arr){
arr[0] = 200;
System.out.println("text100中的数组");
for(int i = 0;i < arr.length;i++){
System.out.prinit(arr[i] + "\t");
}
}
}
与基本数据类型的区别在于在栈中产生的地址,存放的是 指向 引用类型在堆中的地址。如下图:
所以引用类型在栈中产生的内存只是指向堆中的地址。因为改变的是堆中的数据,又因为main中的数据指向的堆中的数据,所以数据的交换会影响到实参。
注意:类也是引用类型。此外,当栈没有使用时,会自动销毁。