函数

函数与数组 - 图1

  • 如果return的返回值类型是void, 那么return语句可以省略不写
  • 在java中,函数体中不可以继续定义函数,只能调用函数



    函数的重载:

    函数与数组 - 图2

  • 调用时,JVM会根据传参的类型去调用对应的函数

  • 函数的重载的区别与函数返回类型无关



    函数的重载用于制造类似功能的函数,但传进去的参数不尽相同的情况



    数组的概念:

    函数与数组 - 图3


    >>> int [] arr = new int [5];

    右边: 使用new关键字 创建一个 int类型的数组,长度为5
    左边:声明一个数组名称([ ] arr),里面存放数据是int类型


    创建一个数字数组时,所有元素都初始化为0。boolean 数组的元素会初始化为false。对象数组的元素则初始化为一个特殊值 null,这表示这些元素(还)未存放任何对象。



    Java内存分布


    函数与数组 - 图4

① 寄存器(CPU)
② 本地方法栈(调用了系统底层的内容)
③ 方法区(还包含常量池、静态方法区)
④ 虚拟机栈(存放着方法函数、局部变量)
⑤ 堆(存放着实体,包括数组、对象)




堆(Heap),此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例都在这里分配内存。所有的对象实例以及数组都要在堆上分配


通常所说的栈( Stack),是指虚拟机栈。虚拟机栈用于存储局部变量等。
局部变量表存放了编译期可知长度的各种基本数据类型( boolean、byte、char、 short、int、 float、long、double)、对象引用( reference类型它不等同于对象本身,是对象在堆内存的首地址)。方法执行完,自动释放(弹栈)

方法区
方法区( Method area),用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据

堆和栈的区别:
栈:定义在方法中的变量都称为局部变量

  • 栈内存的加载是从底部开始的,函数只有被运行时,才会入栈(当函数运行完毕,函数也就被销毁了,对应的栈也弹出了)
  • 变量所属的作用域一旦结束,该变量就被释放(栈内存也被自动释放了)



    堆:堆存储的都是实体(new关键字会在堆里开辟新空间)

  • 当某个实体的属性被删掉时,该实体仍然会存在

  • 堆根据首地址值进行寻址,堆内存中的每一个变量都有默认初始值,而栈没有。
  • 当实体的堆地址被指向为空或者被销毁后,会被JVM虚拟机进行内存回收


数组的本质:

数组名存放在栈中
数组实体内容存放在堆中(堆有相应的地址值)
栈中的数组名相当于门牌号(该数组名指向了该内存地址)
它根据引用找到数组实体数据

函数与数组 - 图5


二维数组

二维数组的创建同样是在内存新开辟一个数组空间,然后地址指向空间的过程:

函数与数组 - 图6


定义方法一:
Int [] [] arr = new int [3] [];


定义方法二:
Int [] [] arr = {{},{}};