通过接口引用对象
我们应该立马想到多态,这其实也是多态的一种,它的优点是灵活,但是缺点是这个引用变量不能调用接口中没有定义但在使用的构造器类中实现的方法,即类似多态中的父类对象不能调用子类独有的方法。
- 灵活:这个其实很好理解,灵活的原因在于接口可以有多个实现类,不同的实现类可以对接口中的方法定义有不同的实现,例如List接口下的ArrayList和LinkedList,我们可以按照自己的需要进行更换,如果周围的代码有依赖List引用的对象,那么即使从ArrayList更换为LinkedList也只需要改变new关键字调用的类构造器,这些改变对周围代码来说也是屏蔽的。
- 缺点:缺点也是基于它的灵活性来说的;正因为可以对周围代码屏蔽性的更换实现类,但是如果周围代码有依赖于原来实现类的独有实现方法,这个时候就会出现问题了。
那么在什么时候使用接口引用对象呢?
首先:如果有合适的接口类型存在,那么对于参数、返回值、变量和域来说,就应该使用接口类型来声明。只有当你利用构造函数创建某个对象的时候,才真正引用这个对象的类。 其次适合于用类来引用对象的情形:
- 那肯定就是使用接口解决不了问题的时候了,自然就和接口引用对象的缺点有关。当引用对象需要调用实现类中独有的实现方法时,例如ArrayList的clone(),List中是没有这个方法定义的。
- 该对象隶属于框架,而框架的基本类型是类,不是接口。(对象属于基于类的框架)
例如在 java.io 类中许多诸如 OutputStream 之类的就属于这种情况。 3.类实现了接口,但是它提供了接口中不存在的额外方法。 例如LinkedHashMap,程序依赖于这些额外的方法,这种类就应该只被用来引用它的实例。
总结
给定的对象是否具有适当的接口应该是很明显的。如果是,用接口引用对象就会使程序更加灵活;如果不是,则使用类层次结构中提供了必要功能的最基础的类。
|