对象和数组的内存
- Java中所有对象都是new出来的;所有对象的内存都在堆空间;所有保存对象的变量都是引用类型
- Java运行时环境有个垃圾回收器(Garbage Collector),会自动回收不再使用的内存
- 当一个对象没有任何引用指向时,会被GC回收掉内存
- 对象数组每个单元存储的是一个堆空间对象的地址
内存区域划分
-
PC寄存器 (Program Counter Register)
存储Java虚拟机正在执行的字节码指令的地址
-
Java虚拟机栈(Java Virtual Machine Stack)
存储栈帧
-
堆 (Heap)
存储GC所管理的各种对象
-
方法区 (Method Area)
存储每一个类的结构信息(比如字段和方法信息、构造方法和普通方法的字节码等)
-
本地方法栈(Native Method Stack)
用来支持native方法的调用(比如用C语言编写的方法)
-
Java的堆内存申请会自动进行初始化
数组
-
引用类型
数组元素存储在堆空间
创建
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int[] arr1;
int[] arr2 = {}; // 空数组
int arr3[] = {}; // 空数组
// 定义时指定内容
int[] arr4 = {1, 3, 4, 5};
int[] arr5 = new int[] {1, 2, 3, 5};
// 定义时指定容量
int[] arr6 = new int[4];
arr6[0] = 1;
arr6[1] = 2;
// 多维数组
int[][][] arr7;
int[] arr8[][];
this
-
本质是一个隐藏的、位置最靠前的方法参数
- 访问当前类中定义的成员变量
- 调用当前类中定义的方法(包括构造方法)
方法
方法签名
由方法名、参数类型两部分组成
1
2
3
4
// 方法签名为:sum(int, long, double)
double sum(int i, long l, double d) {
return i + l + d;
}
可变参数
- 必须是参数列表的最后一个参数
1
int sum(String name, int... numbers) {}
构造方法
-
在构造方法中调用其他构造方法
构造方法调用语句必须是构造方法中的第一条语句
1 2 3 4 5 6 7 8 9
public Cat(String name, int age) { this.name = name; this.age = age; } public Cat(String name) { // 如果出现,必须是第一句 this(name, 0); }
重写 (Override)
-
方法签名一样才构成重写
-
子类重写父类的方法
权限
>= 父类的方法的权限
-
子类重写父类的方法的
返回值类型
<= 父类方法的返回值类型
1 2 3 4 5 6 7 8
Object test() { return 10; } @override String test() {// 返回值类型变为Object的子类 return ""; }
super
-
访问父类中定义的成员变量
-
调用父类中定义的方法 (包括构造方法)
子类的构造方法必须先调用父类的构造方法
编译器会自动调用父类无参的构造方法
```java class Animal { private int age; Animal(int age) { this.age = age; } }
class Cat extends Animal { private String name; Cat(String name, int age) { super(age); this.name = name; } }
GUI编程
AWT (Abstract Window Toolkit)
Java官方最早推出的GUI编程开发包,界面风格跟随操作系统
SWT (Standard Widget Toolkit)
由
IBM
推出、著名的开发工具Eclipse就是用SWT
开发的Swing
在
AWT
的基础上扩充了功能,灵活且强大,在不同操作系统中可以保持统一风格JavaFX
Java官方推出的最新一代GUI编程开发包,参考资料比Swing少一些
数组遍历
-
索引
1 2 3
for(int i = 0; i < list.length; i ++) { list.remove(i); }
-
forEach
1 2 3 4
for (Integer e : list) { // 有问题 list.remove(e); }
1 2 3 4
list.forEach((e) -> { // 有问题 list.remove(e); });
-
iterator
1 2 3 4 5
Iterator<Integer> it = list.iterator(); while(it.hasNext()) { // 有问题 list.remove(it.next()); }
遍历时使用迭代器的方法区删除
1 2 3 4 5 6
Iterator<Integer> it = list.iterator(); while(it.hasNext()) { // 没问题 it.next(); it.remove(); }
IO
File
-
文件分隔符
1 2 3 4 5
/* windows下为backSlash(\) mac、linux下为slash(/) */ File.seperator;
-
路径分隔符
1 2 3 4 5
/* windows下为semicolon(;) Mac, Linux下为colon(:) */ File.pathSeperator;
-
文件名
在Windows、Mac下,不区分大小写
在UNIX、Linux下,区分大小写