java18 基本数据类型的值传递 引用数据类型的地址传递(数组的第一个元素与第二个元素调换位置)
所有对象和数组都是在堆里创建的
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个元素位置处
//调用方法前后输出对比