- 今天整理了Java函数,数组,内存加载使用的问题,在这之前我先把昨天剩下的for语句写下来。
for语句
\n 回车
\t 制表符
\b 退格
\r 按下回车键windows系统中回车符其实是由两个符号组成 \r \n
linux 回车符只是 \n1
System.out.println("\"hello world\"");
上段代码最后输出结果是 “hello world” 有引号的,\会将他下一个字符转义
break 跳出
作用范围:swich语句 or 循环语句
当break语句单独存在时,下面不要定义其他语句,因为执行不到
1
2
3
4
5
6A:for(int x=0; x<3; x++){
B:for(int y=0; y<6; y++){
System.out.println(x);
break A;
}
}大家观察一下上面的语句,这就是break的特殊用法,可以将for循环定义名字,break选择性的使用。
continue 继续
作用范围:循环结构
结束本次循环,继续下次循环
continue语句单独存在时,下面不要定义其他语句,因为执行不到
1 | for(int x=0; x<9; x++){ |
函数
- 函数:定义在类中具有特定功能的一段小程序,也称方法。
定义及格式
- 定义函数格式:
1 | 修饰符 返回值类型 函数(参数类型 形参1, ... ... ,){ |
- 无具体返回值时,返回值类型用void,return可以忽略不写
功能
1 定义函数可将代码封装
2 便于对该功能复用
3 函数只有被调用才能执行
两个明确
- 1 函数功能结果是什么?
- 2 实现过程中是否需要未知内容参与运算?
函数重载
- 1 同一个类中的同名函数
- 2 参数个数不同或者是参数类型不同
- 3 函数重载与返回值无关
- 4 Java严谨性语言,如果函数出现调用不确定性,会编译失败(比如int返回值却是double参数类型)
数组
内存
- 内存的划分
- 寄存器
- 本地方法区
- 方法区
- 栈内存
- 堆内存
栈内存
- 存储的都是局部变量,变量所属作用域一旦结束,该变量就自动释放
堆内存
- 储存数组和对象(数组就是对象),new 建立的都在堆上
- 特点:
- 每个实体都有首地址值
- 堆内存中每个变量都有默认内存初始值,根据类型不同而不同
(int -> 0,double -> 0.0,float -> 0.0f,boolean -> false,char -> ‘\u0000’) - 垃圾回收机制
数组运行内存图解
一维数组
接下来我就通过这段代码来演示运行时的内存变化
1
2
3
4
5
6
7int[] x = new int[3];
int[] y = new int[3];
x[0] = 9;
y[0] = 34;
x = y;
System.out.println(x[0]);
y = null;栈中运行main然后存入x数组名,堆中分配地址(16进制),找到这个地址,开辟数组大小的空间,并给予其初始值。然后将数组地址传回栈中。
- 给x[0],y[0]赋值时,就是直接在堆内存中更改数据
- x=y 语句的执行实质上就是将y的地址赋给x,下次再调用x的时候,即直接找到y的地址
当y = null; 就是将堆内存 和栈内存的指向关系删去,
1
2int[] x = new int[3];
System.out.println(x[]);如果直接运行上段代码,所得到的结果是一串字符
[I@1540e19d (我运行后的值)
[: 代表数组
I:int 实体类型
1540e19d:16进制的哈希值(地址)
二维数组
- 直接来是二维数组的图解
1
2
3int[][] arr = new int[3][2];
arr[1][1] = 89;
arr[2][2] = 89; //error
大家看下图,以上图为例,所谓二维数组就是栈内存中存下指向堆内存的地址,这个地址是大小为3的数组,初始值为空,然后再创建3个小的数组,每个小数组还有一个地址,将这些地址对应存到之前大小为3的数组中。
1
2
3
4int[][] arr = new int[3][2];
System.out.println(arr);
System.out.println(arr[0]);
System.out.println(arr[0][0]);输出的结果
1
2
3[[I@1540e19d
[I@677327b6
0再来看看另一种定义下的情况
1
2
3
4int[][] arr = new int[3][];
System.out.println(arr);
System.out.println(arr[0]);
System.out.println(arr[0][0]);结果如下
1
2
3[[I@1540e19d
null
Exception in thread "main" java.lang.NullPointerException