函数
- 如果return的返回值类型是void, 那么return语句可以省略不写
在java中,函数体中不可以继续定义函数,只能调用函数
函数的重载:
调用时,JVM会根据传参的类型去调用对应的函数
函数的重载的区别与函数返回类型无关
函数的重载用于制造类似功能的函数,但传进去的参数不尽相同的情况
数组的概念:
>>> int [] arr = new int [5];
右边: 使用new关键字 创建一个 int类型的数组,长度为5
左边:声明一个数组名称([ ] arr),里面存放数据是int类型
创建一个数字数组时,所有元素都初始化为0。boolean 数组的元素会初始化为false。对象数组的元素则初始化为一个特殊值 null,这表示这些元素(还)未存放任何对象。
Java内存分布
① 寄存器(CPU)
② 本地方法栈(调用了系统底层的内容)
③ 方法区(还包含常量池、静态方法区)
④ 虚拟机栈(存放着方法函数、局部变量)
⑤ 堆(存放着实体,包括数组、对象)
堆
堆(Heap),此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例都在这里分配内存。所有的对象实例以及数组都要在堆上分配
栈
通常所说的栈( Stack),是指虚拟机栈。虚拟机栈用于存储局部变量等。
局部变量表存放了编译期可知长度的各种基本数据类型( boolean、byte、char、 short、int、 float、long、double)、对象引用( reference类型它不等同于对象本身,是对象在堆内存的首地址)。方法执行完,自动释放(弹栈)
方法区
方法区( Method area),用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据
堆和栈的区别:
栈:定义在方法中的变量都称为局部变量
- 栈内存的加载是从底部开始的,函数只有被运行时,才会入栈(当函数运行完毕,函数也就被销毁了,对应的栈也弹出了)
变量所属的作用域一旦结束,该变量就被释放(栈内存也被自动释放了)
堆:堆存储的都是实体(new关键字会在堆里开辟新空间)当某个实体的属性被删掉时,该实体仍然会存在
- 堆根据首地址值进行寻址,堆内存中的每一个变量都有默认初始值,而栈没有。
当实体的堆地址被指向为空或者被销毁后,会被JVM虚拟机进行内存回收
数组的本质:
数组名存放在栈中
数组实体内容存放在堆中(堆有相应的地址值)
栈中的数组名相当于门牌号(该数组名指向了该内存地址)
它根据引用找到数组实体数据
、
二维数组
二维数组的创建同样是在内存新开辟一个数组空间,然后地址指向空间的过程:
定义方法一:
Int [] [] arr = new int [3] [];
定义方法二:
Int [] [] arr = {{},{}};