1. protected修饰符:同包或子类(不同包)
区分普通人和专业人调用的一些方法
2. 抽象:abstract修饰类和方法
抽象类不可实例化,避免错误的new对象
抽象方法是用abstract修饰的方法声明,没有方法体,可以视为代码化的业务规范
子类必须实现父类的抽象方法
3. 接口:包含一堆抽象方法,没有属性
实现接口的类必须实现所有抽象方法(不必abstract修饰),提供一种特定角色(Child类,Pupil接口)。
一个类实现了一个接口,它同时包含类类型和接口类型,实例使用接口类型时,强调的是一种特殊角色。
接口也可以继承,子接口自动拥有父接口的抽象方法;多重继承,弥补了类的单一继承
接口中可以使用default关键字修饰方法,定义默认方法,提供默认实现
4. Collection集合框架:一组元素,可添加、删除、遍历、有数量。(弥补数组长度固定的缺陷)
- List:有顺序、可重复
- Queue:有头有尾、先进先出
- Set:无序、不重复 (口袋集合)
Collections工具类:Collections.sort(List list, Compataor cmp)可以自定义比较器
(1). ArrayList:动态扩容的数组
容量即最大能放多少个元素,当放满了,需扩容至当前的1.5倍,创建容量更大的数组,将原数组拷贝过去(效率低)。当new未指定容量,第一次add添加元素时,初始化容量为10。
查询、末尾增删性能好,数组中间增删性能差(移动元素)——>链表。
无法存储大数据量,无法找到一块很大的连续内存空间。
Vector底层是数组,是线程安全的(synchronized关键字)。可以调用Collection工具类中的static List synchronizedList(List list)将ArrayList变成线程安全的。
(2). LinkedList:双向链表,first、last头尾节点
查询效率低(get(index),但从头遍历),增删效率高。有下标但内存不一定连续。
add(element, index)指定位置插入,remove(index)指定位置删除
addFirst、addLast、pollFirst、pollLast、getFirst、getLast 头尾增删查
LinkedList.add只能添加元素至末尾;ListIterator接口的add方法可以添加至链表中间。
(3). Set:无序(没有索引)、不重复
与Collection差不多,但更强调不重复唯一性
add时判断是否重复:先比hashcode,hashcode相同再用equals判断逻辑内容是否相同
有三个实现类:HashSet(无序)、LinkedHashSet(按添加顺序)、TreeSet(Unicode编码顺序)
5. Map
6. 线程
(1). 继承Thread类和实现Runnable接口:Thread类实现了Runnable接口
如果涉及到多个线程共享资源,使用Runnable接口方式,避免了单继承的限制。
Thread类有start()——>start0()——>run()方法,Runnable只有run()。start并不会马上执行线程,只是可运行状态,取决于cpu调度。
(2). 常用方法:
(3). 线程生命周期:7种状态(new、可执行(挂起/就绪、运行)、终止、等待、计时等待、阻塞)
(4). 线程终止:通知方式,A线程想终止B线程,就要在A内有B对象,通过setLoop方法终止
B中奖loop作为循环条件while(loop),在A中调用b.setLoop(false)
(5). 同步:敏感数组不允许被多个线程同时访问
synchronized关键字,可使用代码块和方法,推荐代码块(必须是线程们的同一个对象)
释放锁:正常结束;return和break;异常;wait()
(6). 守护线程:当其他线程结束以后,守护线程也会结束,并不是立马结束,要给cpu反应时间