值传递 和 地址传递 的区别(好多句话才可以说清)

要知道什么是**值传递**和**地址传递**,首先要知道什么是**基本数据类型**和**引用类型**。
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*/
	}

谢谢你的阅读,希望对你有帮助!

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不动声色的小蜗牛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值