首页 > 技术文章 > java18

-zero 2019-01-28 22:55 原文

所有对象和数组都是在堆里创建的
1.数组在堆中的存储方式。

int[ ] ages      =         new int[ ]{10,20,30}; 
//声明数组ages         //在堆中开辟了一块空间并将数组初始化  
//同时将新开辟空间的内存地址赋值给了ages)
System.out.println(ages);
【[I@15db9742】//输出内存地址

java的jvm中有自动清除垃圾(GC)的功能。
当内存资源紧张时,无需手动控制内存的的释放,它会自动清除没用的对象
2.对象在堆中的存储方式。
在栈中创建的成员变量没有初始值
堆中存放了对象的地址,并且存放的每个基本数据类型都有初始值
在执行指令时会根据栈中的地址去堆中寻找

对象1
Person zly = new Person();
zly.name= "赵丽颖";
zly.age = 18;
对象2
Person rh = new Person();
rh.name = "如花";
System.out.println(rh.name);
【如花】
栈:Person zly = fdsfdsf(内存地址)
堆:Person 
   地址值:fdsfdsf
 name       赵丽颖
 age          18
zly = rh;
System.out.println(zly.name);
【如花】
zly = null;
【java.lang.NullPointerException】  空指针异常(没有地址)

凡是使用new关键字创建出来的类型都是引用数据类型

引用数据类型:类,数组,枚举,注解,接口
基本数据类型的存储空间只在栈中
引用数据类型的存储空间在栈和堆中。

基本数据类型的值传递

	static void a(int x) {
		System.out.println("1="+x);
		x = 100;
		System.out.println("2="+x);
	}
	public static void main(String[] args) {
		int x = 20;
		a(x);
		System.out.println("3="+x);
	}
	【1=20
            2=100
            3=20
            】

分析:main方法先入栈,a方法后入栈
先x被赋初值:x =20
接着调用a方法
所以 1 = 20,
再一次x赋值,所以2 = 100
接着a方法出栈
在打印3 = 20;

引用数据类型的地址传递(数组的第一个元素与第二个元素调换位置)

//分析:将第0个元素位置空出来,
把第1个元素放进去
将第0个元素放在第1个元素位置处
//调用方法前后输出对比

推荐阅读