Java核心技术阅读笔记
1、一个文件里只能有一个public类,且需与文件名相匹配,但可以有任一数目非public类。
2、访问器(get方法)和修改器(set方法),访问器不要返回可变对象。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
class Employee { private Date hireDay ; public Date getHireDayO { return hireDay ; / / Bad } } Employee harry = . . Date d = harry . getHi reDayO ; double tenYearsInMilliSeconds = 10 * 365.25 * 24 * 60 * 60 * 1000 ; d . setTime ( d . getTime () - ( long ) tenYearsInMilliSeconds ) ; //破坏了封装性,d和hireday指向同一个地址,导致d可以直接修改类的私有属性数据 //应该返回 return (Date)hireDay.clone(); // Ok
3、数据域初始化顺序:初始化为默认值(0,false,null)->初始代码块->构造函数 (静态初始化块会在类第一次加载时初始化)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
class Employee { private static int nextld ; private int id ; private String name ; private double salary ; // 初始代码块先初始化 { id = nextld; nextld + +; } public Employee ( double salary ){ this.salary=salary; } }
4、强制类型转换之前使用obj
instanceof
Class
判断是否可进行类型转换,obj 为一个对象,Class 表示一个类或者一个接口,当 obj 为 Class 的对象,或者是其直接或间接子类,或者是其接口的实现类,结果result 都返回 true,否则返回false。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
boolean result; if (obj == null) { result = false; } else { try { T temp = (T) obj; // checkcast result = true; } catch (ClassCastException e) { result = false; } }
5、labmda类似匿名函数,自动实现函数式接口的抽象函数,因此要传入lambda表达式,需要提供函数式接口。只有一个抽象方法的接口都是函数式接口,最好还是加上@FunctionInterface,编译器会检测是否符合函数式接口规范。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
public static void lambdaTest(int n,Runnable runnable){ for(int i =0;i<n;i++){ runnable.run(); } } public static void main(String[] args){ lambdaTest(10,()->{ System.out.println("重复"); }); }
6、iterator remove()和set()方法,移除或修改next()或previous()返回的元素,依赖于迭代器上一步的状态。而add方法只依赖于位置,在迭代器位置之前插入。
7、java -jar test.jar
java -classpath test.jar com.test
log4j.appender.File.File=/tmp/logs/log /开头表示当前磁盘根目录 tmp/logs/log 表示项目根目录 与src、target等同级目录
仅作为笔记使用,记录信息过于简洁。