接口和类

接口中的方法自动是public abstract 的.

* 接口优先于抽象类:
   java提供了两种机制可以用来定义允许多个实现的类型:接口和抽象类。
   最明显的区别在于,抽象类允许包含某些方法的实现,接口则不允许。
   更重要的区别在于,为了实现抽象类定义的类型,类必须成为抽象类的子类。
   因为java只允许单继承,所以抽象类受到了极大的限制。
   因为java允许实现多个接口,现有的类很容易被更新以实现新的接口。
   接口是定义混合类型的理想选择,接口允许我们构造非层次结构的类型框架。
   通过包装类(Decorator模式),接口使得安全地增强现有类的功能成为可能。
   通过对导出的每个重要接口提供一个抽象的骨架实现类,把接口和抽象类的优点结合起来。骨架实现

   被称为AbstractInterface。

   Collections Framework为每个重要的集合接口都提供了一个骨架实现,包括AbstractCollection、

   AbstractSet、AbstractList、AbstractMap。

***************************************************************
 * 接口只用于定义类型:
   当类实现接口时,接口就充当可以引用这个类的实例的类型。
   常量接口模式是对接口的不良使用,这种接口没有包含任何方法,只包含静态的final域,每个final域都

   导出一个常量。
   要导出常量,可以有两种合理的选择方案:
   (1)如果这些常量与某个现有类或者接口紧密相关,应该把这些常量添加到这个类或者接口中。
   (2)如果这些常量最好被看作枚举类型的成员,就应该使用枚举类型来导出这些常量。

***************************************************************
 * 类层次优先于标签类:

   标签类是指使用类成员变量来表示对象的类别,通常应该考虑子类型化(subtyping)。


   当想要编写一个包含显式标签field的类时,应当考虑一下,这个标签是否可以被取消,这个类是否可以

   用类层次来代替。
   当遇到一个包含标签field的现有类时,就要考虑将他重构到一个类层次结构中去。

***************************************************************
 * 用函数对象表示策略:
   如果一个类仅仅导出一个方法,该方法执行其他对象上的操作(这些对象被显式传递给方法),它的

   实例实际上等同于指向该方法的指针,这样的实例被称为函数对象。
   具体的策略类往往使用匿名类声明,但是以这种方式使用匿名类,将会在每次执行调用的时候都创建

   一个新的实例。
   函数对象的主要用途就是实现策略模式(strategy)。
   当一个具体策略设计用来重复使用的时候,它的类通常就要被实现为私有的静态成员类,并通过

   public static final field被导出,其类型为策略接口。
 

***************************************************************
 * 优先考虑静态成员类:
   嵌套类(nested class)是指被定义在另一个类内部的类。嵌套类存在的目的应该只是为它的外围类

  (enclosing class)提供服务。
   嵌套类有四种:静态成员类、非静态成员类、匿名类、局部类(local)。除了静态成员类,其他三种被

   称为内部类(inner class)。

 * 静态成员类:最好把它看作一个普通的类,只是碰巧声明在另一个类内部,它可以访问外围类的所有

   成员,包括声明为私有的成员。
   静态成员类和外围类的其他静态成员一样,也遵守同样的访问规则,如果被声明为private的,它就只能

   在外围类的内部才可以被访问。
   如果声明的成员类不要求访问外围实例,应该使用static使它成为静态成员类以提高性能和节省空间。

 * 非静态成员类:它的每个实例都隐含着与外围类的实例相关联。在非静态成员类实例的方法内部,

   可以调用外围实例上的方法,或者利用修饰过的this构造或者外围实例的引用。
   在没有外围类实例的情况下,想要创建非静态成员类的实例是不可能的。当非静态成员类的实例被

   创建的时候,它与外围实例的关联关系也随之建立起来,
   这种关联关系以后不能被修改,每个实例都将包含一个额外的指向外围对象的引用。使用 Outer.this.field

   访问外围类的成员。

 * 匿名类:匿名类没有名字,它不是外围类的一个成员,并不与其他成员一起被声明,而是在使用的同时

   被声明和实例化。它可以出现在代码中任何允许存在表达式的地方。
   无法声明一个匿名类来实现多个接口,或者同时扩展类和实现接口。
   匿名类的常见用法是动态地创建函数对象。另一种用法是创建过程对象(Runnable、Thread)。

 * 普通(非内部)类不可设为private 或protected——只允许public 或者“友好的”。

猜你喜欢

转载自jaesonchen.iteye.com/blog/2286864