java基础中值传递与地址传递

首先在说明之前,我们需要了解在计算机中数据的存储方式
如图在运行软件时,计算机的内存条会开辟相应的内存区来进行数据的存储,而且开辟了俩块内存区,一个是栈,一个是堆,二者的数据的特点是不同的,栈中存储的数据则是数据的名及其赋予的数值(基本数据类型)或者其存储地址(引用类型);而堆则开辟一个内存空间用以存储数据(引用类型)的具体赋值。数组是引用类型,在栈开辟一个 内存空间,同时在堆里也开辟一个空间,保存了数组中的数据,而栈则保存堆中数据保存的地址值(是一个十六进制的地址)。因为在输出变量时,未加索引位置和中括号即[i],输出的是栈的值,因此输出的是地址值,而如int等是基本数据类型,直接在栈中存储其相应所赋予的值,因此输出时,输出的是相应的赋值。栈和堆俩者数据的输出先后是不同的,栈是先进后出,而堆则为先进先出。
首先:值传递是指在调用函数时实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际函数。
引用传递是指调用函数时将实际参数的地址直接传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数。
在值传递和地址传递中二者是有区别的。
(1)值传递
public static void main(String[] args) {//main ——>Alt + /
int score = 16;
System.out.println(score);//输出为16
test(score);//值传递,转到下个函数(方法)执行
System.out.println(score);//仍然输出16
}

public static void test(int a) {
	System.out.println("a的值"+a);
	a = 0;//仅仅是修改了a的值,在栈中又开辟了一个a的内存区,改的是a
}
    (2)地址传递
    public static void main(String[] args) {
	int [] scores = {100};
	System.out.println(scores);
	System.out.println(scores[0]);//输出的是堆中的赋值
	test(scores);转方法
	System.out.println(scores[0]);//0  因为scores和array虽然在栈中开辟了俩个空间,但二者公用一个堆中的数据,当转方法后100被改为0,二者的值都是0
}

public static void test(int [] array) {
	System.out.println(array);
	array[0] = 0;
}
可以从这俩个看出二者的区别

在这里插入图片描述在这里插入图片描述

发布了28 篇原创文章 · 获赞 0 · 访问量 441

猜你喜欢

转载自blog.csdn.net/syhfly2333/article/details/104455838