-
导出类构造器中最好只用基类的final或者private方法
-
策略:将不变的方法封装至类为策略,将对象作为参数传入main中某方法中
-
适配器:将不符合接口的类,封装在接口下
-
要创建不带任何方法定义以及成员变量的基类;接口,而不用抽象类
-
工厂
-
匿名內部类有参数的构造函数:
new Class(x){…}
- 匿名内部类可用其所在的作用域内的变量,且必为static变量
void func(final int a){
new Class{
i = a;
}
}
- 匿名內部类调用构造器(实质是实例的初始化):
new Class(x){
{ ... }
}
-
Collections.addAll(collection, elem1, elem2, …);
-
list.addAll(list/ index, list);
-
直接修改Arrays.asList( T[ ] )传回的list会改变底层的数组,建议再装进一个容器里:
new Collection(Arrays.asList( T[ ] ));
Exception:
-
导出类异常是基类异常的子集
-
构造器中如果有需要清理的对象,比如要进行file.close()
此时需要嵌套的 try catch :
try
{
// 需要清理的对象 obj
try
{
// 其他操作
}
catch (Exception e)
{
obj.dispose();
}
}
catch (Exception e)
{
// 不需要再写dispose()
}
- 派出类构造器不能捕获基类构造器的异常
- 可以把导出型MyException放在try catch中优先的catch中,用来屏蔽这类Exception,方便对其做特殊处理
因为都是try都是优先找最近的catch模块 - 可以通过把异常包装成RunTimeException来暂时搁置这个异常(当然会在运行时的main中自动捕捉),方便在不知道怎么处理这个异常的时候,率先通过编译;后来需要处理的时候就捉住这个RunTimeException e并e.getCause();
String
- String的每个操作都要重开一片内存,所以String本身是不可更改的;同时.clone()的时候就不需要考虑深复制问题
- 如果循环中需要str1 + str2,建议用StringBuilder,效率较高
- String.format() 用来排版比较方便,操作有点像c语言的printf