public class subclass extends superclass{ private final date date; public subclass() { date = new date(); } public void m() { system.out.println(date); } public static void main(string[] args) { subclass s = new subclass(); s.m(); } }
item 16:在接口与抽象类之间优先选择前者 【程序编程相关:客户端源码分析之二: Storage 类】
class superclass{ public superclass() { m(); } public void m() { }}由于在date被初始化之前super()已经被调用了,所以第一次输出null而不是当前的时间.由于在clone()或者序列化的时候非常类似构造器的功能,因此readobject()与clone()方法内最好也不要包括能被覆盖的方法. 【推荐阅读:BT客户端源码分析之一:总述】
item 17:接口只应该用来定义类型 【扩展信息:客户端源码分析之三: StorageWr】
接口与抽象类都用来实现多态,不过我们应该优先考虑用接口.知道吗?james说过如果要让他重新设计java的话他会把所有都设计成接口的.抽象类的优点是方便扩展,因为它是被继承的,并且方法可以在抽象类内实现,接口则不行.
接口可以这样用的 collection c = new xxxx();这是我们最常用的.不要把接口用来做其他的事情,比如常量的定义.你应该定义一个类,里面包含public final static 得字段.
item 18: 在静态与非静态内部类之间选择前者
如果一个类被定义在其他的类内部那么它就是嵌套类,可以分为静态内部类.非静态内部类与匿名类. static member class 得目的是为enclosing class服务,如果还有其他的目的,就应该把它设计成top-level class.nonstatic member class是与enclosing class instance关联的,如果不需要访问enclosing class instance的话应该把它设计成static得,不然会浪费时间与空间.anonymous class是声明与初始化同时进行的.可以放在代码的任意位置.典型应用是listener 与process object例如thread.