Java中值传递与地址传递

Java内存区中的分块

Java中值传递与地址传递_第1张图片
在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 的二进制补码储存在栈中。画图理解为:
Java中值传递与地址传递_第2张图片

部分代码类型解析

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均为基本数据类型,作用空间不同,两者互不影响。可用图解释:
Java中值传递与地址传递_第3张图片
有上面两例可以看出,函数方法可以改变对应数组数据在堆中的存储位置,而无法改变因作用空间不同的基本数据类型的数据。

你可能感兴趣的:(JAVA学习,java)