Java中值传递与地址传递

Java内存区中的分块

在java内存区中数据一般存储在两个区域
在Java内存区中有两个存储的区域,栈和堆。栈一般存储数据以及数组的首地址,而堆则用于存放数组的数据。

存储地不同的原因

数组属于引用数据类型,在栈中储存数组的首地址,而形如int,float,double等类型的数据为基本数据类型,在栈中储存器二进制的补码。可通过代码输出接过来观察奇特点:

public class Array{
	public static void main(String[] args) {
    int [] scores = {100};
    int age = 100;
    System.out.println(scores);
    System.out.println(scores[0]);
    System.out.println(age);
  }

其结果依次为:[I@52e922 100 100,其中52e922为数组scores的首地址,scores[0] = 100的二进制补码存放在堆中,age= 100 的二进制补码储存在栈中。画图理解为:
在这里插入图片描述

部分代码类型解析

package zzu957;
public class Array{
	public static void main(String[] args) {
    int [] scores = {100};
    System.out.println(scores);
    System.out.println(scores[0]);//100
    test(scores);
    System.out.println(scores[0]);//0
  }
  
  public static void test(int [] array) {
    System.out.println(array);
    array[0] = 0;
  }
  /*结果
  [I@52e922
  100
  [I@52e922
  0
   */
}

第一个为输出scores数组存放在栈中的首地址,第二个输出的则是储存在堆中的int型数据,第三个输出为调用函数/方法时,将scores数组调用至test函数,输出其首地址,并同时更改了数scores[0]的数值。因此最后输出scores[0]=0。

package zzu957;

public class zzu {

	public static void main(String[] args) {
		int score = 100;
		System.out.println(score);
		test(score);
		System.out.println(score);

	}
	public static void test(int a) {
		System.out.println("###"+a);
		a=0;
		System.out.println("###"+a);
	}

}
/*结果为
100
###100
###0
100
*/

由结果可以看出:函数仅仅改变了int a的值,没有对sorce的值造成更改,其原因为:a与sorces均为基本数据类型,作用空间不同,两者互不影响。可用图解释:
在这里插入图片描述
有上面两例可以看出,函数方法可以改变对应数组数据在堆中的存储位置,而无法改变因作用空间不同的基本数据类型的数据。

发布了3 篇原创文章 · 获赞 0 · 访问量 107

猜你喜欢

转载自blog.csdn.net/zzu957/article/details/104461399
今日推荐