目录
复习小结1
Iterator
在iterator中做改变,可能会出现迷惑的行为,例如:
public static void main(String[] args) {
// TODO Auto-generated method stub
List<String> slist = new ArrayList<>();
slist.add("6.001");
slist.add("6.002");
slist.add("6.003");
for(String s : slist)
{
if(s.startsWith("6."))
slist.remove(s);
}
System.out.println(slist);
}
运行结果如下:
java禁止了这种行为,这是因为for-each循环的实现是使用迭代器iterator,而迭代器依据下标,remove方法改变了下标,会导致运行结果与本质不一致,故被java设置为了exception。
使用迭代器remove是允许的:
public static void main(String[] args) {
// TODO Auto-generated method stub
List<String> slist = new ArrayList<>();
slist.add("6.001");
slist.add("6.002");
slist.add("6.003");
System.out.println(slist);
Iterator iter = slist.iterator();
while(iter.hasNext())
{
String s = (String) iter.next();
if(s.startsWith("6."))
iter.remove();
}
System.out.println(slist);
}
运行结果如下:可以看到slist执行了我们预期的行为
访问权限控制
四种访问权限控制符:
this与super关键字:
在构造器中可以用this调用本类构造器,用super调用父类构造器,但它们必须在构造器的第一行!
重载(Overload)
是一种静态类型的多态:进行静态类型检查,根据参数列表进行最佳匹配,编译时就决定具体执行哪一个方法;与之相对的,Override是在运行时进行动态检查。
必须:不同的参数列表
可以有:
- 不同的返回值类型
- 不同的访问权限
- 定义不同的异常
- 类内重载或者子类重载
eg:
重载是静态类型检查,故考察声明类型,调用的是参数列表是animal的方法
HashCode Contract
相等的对象必须有相同的HashCode。
Why?
若不相同,则被放置在不同的bucket中,在下一次查找时,明明是相等的对象,却有可能找不到,这是令人迷惑的。
图示如下:
通用准则:Override Equals时,也将HashCode一并Override,除非能保证ADT不被放到Hash类型的集合类中。
通配符
泛型不协变:
public static void printList(List<Object> list )
{
for(Object o : list)
{
System.out.println(o + " ");
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
List<String> slist = new ArrayList<>();
slist.add("a");
slist.add("b");
slist.add("c");
printList(slist);
}
通配符?代表任何类,就能完成这一点:
只需简单将改为<?>即可
下限通配符<? super A>:代表是A的父类,A是下限
上限通配符<? extend A>:代表是A的子类,A是上限
注:这意味着list中可以存放多种类型,但一个list只能统一存放一种类型,不意味着能同时存放多种类型。
委托
Comparable 与 Comparator接口
Comparator接口:
int compare(T o1, T o2); // 往往new一个对象,传Comparator对象
Comparable接口:
int compareTo(T o); //比较代码放在类中实现
继承与委托的选择
若子类只需要调用父类的一小部分方法,委托是更好的选择,避免继承了大量无用的方法。
CRP原则
组合优先于继承,组合是委托的一种形式。
用接口定义侧面行为,接口之间可以用extend扩展,类通过implements组合接口,避免复杂的继承关系,是一种良好的设计模式:
委托的四种类型:
- Dependency
通过方法参数发生联系 - Association
是has-a关系,通过属性、实例变量发生联系,永久的关联 - Composition
更强的Association,很难发生变化 - Aggregation
更弱的Association,has-a关系,拥有set方法,适合动态变化。