不要编写返回可变对象的访问器方法(P113)
class Employee{
private Date date;
public Date getDate(){
...
return date;
}
}
我们获取Date对象之后就可以修改date域的内容:
//引用了同一个对象
getDate.setTime(xxx);
应用场景:private私有域,可变对象
解决方法:clone出一个对象副本(完全独立),返回副本。
- final实例域(P115)
final修饰符大都修饰基本类型,或者不可变的类(类中的每个方法都不会改变其对象,如String)。
例如:private final Date hiredate;
对象构造之后(即可以在构造函数中指向一个对象,然后不改变引用(事实上也不能))就不能被改变,而不意味着hiredate对象是个常量。任何方法都可以对 hiredate引用的对象调用 setTime方法。
- Java方法参数使用(P123)
一个方法不能够修改基本数据类型的参数(数值型和布尔型)
一个方法可以改变对象参数的状态
一个方法不能让对象参数引用一个新的对象
注: 知乎-java到底是值传递还是引用传递(印象笔记也有保存)
- 重载
overloading 多个方法有相同的名字,不同的参数便产生了重载。
- 初始化
P131
(1) 所有数据域被初始化为默认值(0,false,null)
(2) 按照在类声明中出现的次序,依次执行域初始化语句和初始化块
(3) 如果构造器第一行调用了第二个构造器,则执行第二个构造主体
(4) 执行这个构造器的主体
注: Java中构造代码块和成员变量初始化的顺序关系(印象笔记也有保存)
P149
父类的静态代码块,静态变量(java虚拟机加载时执行,只执行一次)
子类的静态代码块,静态变量(java虚拟机加载时执行,只执行一次)
父类的属性对象(成员变量),父类的普通代码块(按写的顺序执行 new一次,执行一次)
父类的构造函数(new一次,执行一次 )
子类的属性对象 (成员变量) ,子类的普通代码块 (按写的顺序执行 new一次,执行一次 )
子类的构造函数(new一次,执行一次 )
- 修饰符
| 当前类 | 同一个包 | 子类 | 其他包 |
public | √ | √ | √ | √ |
protected | √ | √ | √ | |
默认(无修饰符) | √ | √ | | |
private | √ | | | |
- 多态和动态绑定
多态:一个对象变量可以只是多种实际的数据类型的现象(父类的引用指向子类的对象,调用方法会调用子类的实现,而不是父类的实现;多态与方法覆盖有关,与方法重载无关)
允许不同的类对象对同一个消息做出相应。
三个必要条件:有继承;有重写;父类引用指向子类对象
动态绑定:运行时能够自动地选择调用哪个方法的现象
- 继承
P153
如果子类的构造器没有显式地调用超类的构造器,则将自动调用超类默认(没有参数)的构造器。如果超类没有不带参数的构造器,并且在子类的构造器中有没有显式地调用超类的其他构造器,则Java编译器将报错。
调用构造器的语句只能作为另一个构造器的第一条语句出现。(无论是super还是this调用)
- 集合
public interface Collection<E>{
boolean add(E e);
Iterator<E> iterator();
}
经典写法:
Collection<String> c =...;
Iterator<String> iter = c.iterator();
while(iter.hasNext()){
String element = iter.next();
//do sth with element
}
for each 写法
for(String element : c){
//do sth with element
}
Map结尾的实现Map接口,其他结尾的实现Collection接口
ArrayList | 动态增长和缩减的索引序列 |
LinkedList | 插入删除高效的有序序列 |
ArrayDeque | |
HashSet | 没有重复元素的无序集 |
TreeSet | 有序集 |
EnumSet | |
LinkedHashSet | |
priorityQueue | |
HashMap | 存储键值关联的映射表 |
TreeMap | 键值有序排列的映射表 |
LinkedHashMap | |
WeakHashMap | |
IdentityHashMap | |
- Comparator 和 Comparable 比较
Java 中 Comparable 和 Comparator 比较
Comparable 是排序接口
若一个类实现了Comparable接口,就意味着“ 该类支持排序”。 即然实现Comparable接口的类支持排序,假设现在存在“实现Comparable接口的类的对象的List列表(或数组)”,则该List列表(或数组)可以通过 Collections.sort(或 Arrays.sort)进行排序。
此外,“实现Comparable接口的类的对象”可以用作“有序映射(如TreeMap)”中的键或“有序集合(TreeSet)”中的元素,而不需要指定比较器。
Comparator 是比较器接口。
我们若需要控制某个类的次序,而该类本身不支持排序(即没有实现Comparable接口);那么,我们可以建立一个“该类的比较器”来进行排序。这个“比较器”只需要实现Comparator接口即可。
也就是说,我们可以通过“ 实现Comparator类来新建一个比较器”,然后通过该比较器对类进行排序。
Comparable是排序接口;若一个类实现了Comparable接口,就意味着“该类支持排序”。
而Comparator是比较器;我们若需要控制某个类的次序,可以建立一个“该类的比较器”来进行排序。
不难发现:Comparable相当于“内部比较器”,而Comparator相当于“外部比较器”。