要知道什么是**值传递**和**地址传递**,首先要知道什么是**基本数据类型**和**引用类型**。
Java的基本数据类型就八种(除了这八种之外都是引用类型):
◆整型:byte(8位) short(16位) int(32位) long(64位);
◆浮点型:float(32位) double(64位);
◆字符型:char(16位);
◆逻辑型:boolean(只有true和false两个取值)
而数组就是引用类型。
了解了这些,我们再来区别**值传递**和**地址传递**,
当一个应用打开时,在计算机的内存条中会开辟出一块区域,叫内存区;具体到Java,就叫“java内存区”,
在java内存区中有两个空间:“栈” 和 “堆”;
当数据类型为基本数据类型时,直接在“栈”里开辟空间,然后存储值,例如:
int score = 100;
System.out.println(score);
此时输出的结果就是100
而当数据类型是引用类型时,就在“堆”里开辟一个空间来存储值,再在“栈”里开辟一个空间存储地址,例如:
int [] ages = {19,20,21};
System.out.println(ages);
此时输出的结果就是一个地址,而非19,20,21。之所以会这样,我用一张图来形象表示一下 :
也就是说,当我们打印的时候,输出的都是“栈”里的内容,只有以下这样才会输出堆里的东西:
int [] ages = {19,20,21};
System.out.println(ages[1]);
输出的结果是20。
我们通过两个例子来具体说一下值传递和地址传递:
public static void main(String[] args) {
int score = 100;
System.out.println(score);// 打印的结果为100
test(score);//此处调用下面的test函数
System.out.println(score);// 所以此处打印的还是结果100
}
public static void test(int a) {
a = 0;//仅仅是修改了名为“a”的栈中的值,而对名为“score”的栈中的值无任何影响
}
public static void main(String[] args) {
int [] ages = {19,20,21};
System.out.println(ages);//此处打印的是“栈”里的内容,即地址
System.out.println(ages[1]);//此处打印的结果是20
test(ages);//此处调用test函数
System.out.println(ages[1]);//所以此处打印的结果是25,而非20
}
public static void test(int [] array) {
System.out.println(array);/*因为此处只是将数组ages存储的地址
传递给了数组array(也就是“栈”里的内容),所以此处打印的结果仍是地址*/
array[1] = 25;/*数组ages和数组array因为共同拥有同一个地址,所以也就共用同一个堆,
此处是把堆里的第二个数据重新赋值了25*/
}
谢谢你的阅读,希望对你有帮助!