Loading... # 第九章 接口 **接口和内部类为我们提供了一种将接口与实现分离的更加结构化的方法** ---- ###1. 抽象类和抽象方法 * 对于抽象类,类中可能有一些方法的实现 * 对于一个通用接口,不同的子类可以用不同的方式表示此接口。通用接口建立起一种基本形式,以此表示所有导出类的共同部分。另一种说法是将这个通用接口称为**抽象基类**,简称**抽象类** * java 提供了一个叫做**抽象方法**的机制,这种方法是不完整的,仅有声明而没有方法体。 例如 : abstract void f() * 包含抽象方法的类叫做抽象类。如果一个类包含一个或者多个抽象方法,那么这个类必须被限定称为抽象的。 * 如果从一个抽象类继承,并想创建该新类的对象,那么就必须为基类中的所有抽象方法提供方法定义。如果不这样做,那么导出类便也是抽象类,并且编译器会强制让我们使用 abstract 关键字来限定这个类。 * 某个类是抽象类并不意味着这个类中所有的方法都是抽象的,只有有一个类是抽象的,那么这个类就是抽象类。 * 抽象类是很有用的重构工具,因为他可以使我们很容易的将公共方法沿着继承层次结构向上移动。 ----- ###2. 接口 * 关键字 interface 将产生一个完全抽象的类,他根本就没用提供任何具体实现。它允许创建者确定方法名、参数列表和返回类型,但是没有任何方法体。接口只提供了形式,而未提供任何具体实现。 * 一个接口表示 : 所有实现了该特定接口的类看起来都像这样。因此借口被用来建立类与类之间的协议。 * interface 不仅仅是一个极度抽象的类,因为它允许人们通过创建一个能够被向上转型为多种基类的类型,来实现某种类似多重继变种中的特性。 * 要想创建一个借口,需要使用 interface 关键字来替代 class 关键字 。就像类一样,可以在关键字前面加上 public 关键字,如果不添加的话,则它只有包访问权限。接口可以包含域,但是这些域隐式地是 static 和 final 的。 * 要让某个类遵循某个特定接口(或者一组),需要使用 implements 关键字。他表示 interface 只是他的外貌,但是现在我要声明它是如何工作的。除此之外,它看起来很像继承。 * 在接口中的每个方法都只是一个声明。这个方法如果没有被声明称 public 类型, 那么他们自动就是 public 的。 --- ### 3 . 完全解耦 * 只要一个方法的操作是类而非接口,那么你就只能使用这个类及其子类。 * 创建一个能够根据所传递的参数对象的不同而具有不同行为的方法,被称为是 策略设计模式。 * 适配器设计模式,适配器中的代码将接受你所拥有的接口,并产生你所需要的接口。 ---- ### 4 . java中的多重继承 * 借口不仅仅只是一种更纯粹形式的抽象类,他的目标比这要高。因为接口是没有任何具体实现的,没有任何与接口相关的存储,因此,也就无法阻止多个接口的组合。组合多个借口的行为被称作多重继承。 * 在导出类中,不强制要求必须有一个是抽象的或者“具体的”基类。如果要从一个非接口的类进行继承,那么只能从一个类去继承。剩下的基元素都必须是接口,所有的接口名都置于 implements 之后,用逗号将他们隔开,并且可以向上转型为每个接口,因为每一个接口都是一个独立的类型。 * 使用接口的核心原因:为了能够向上转型为多个基类型(以及由此带来的灵活性)。可以防止客户端程序员创建这个类的对象,并且确保这仅仅是建立一个接口, * 对于如何使用接口和抽象类:如果要创建不带任何方法定义和成员变量的基类,那么应该选着接口而不是抽象类。 ----- ### 5.通过继承来扩展接口 * 通过继承,可以很容易的在接口中添加新的方法声明,还可以通过继承在新接口中组合数个接口。这两种情况都可以获得新的接口。 * 在打算组合不同接口中使用相同的方法名通常会造成代码的可读性的混乱。 ------ ###6 . 适配接口 * 接口最吸引人的地方就是允许同一个接口具有多个不同的具体实现。体现在:一个接受接口类型的方法,这个接口的实现和向这个方法传递的对象取决于方法的使用者。 * 借口一种常见的方法就是策略设计模式,此时编写一个执行某些操作的方法,而这个方法将接受一个同样是你指定的接口。你主要就是声明,你可以用任何你想用的对象来调用我的方法,只要你的对象遵循我的接口。 * 我们可以在任何现有类之上添加新的接口,所以这意味着让方法接受接口类型,是一种让任何类都可以对该方法进行适配的方式。 ---------- ### 7 . 接口中的域 * java 中标识具有常量初始化的值 static final 时,会使用大写字母的风格(在一个标识符中用下划线来分隔多个单词)。接口中的域自动式public的,所以不用显示的指明这一点。 * 接口可以嵌套在类或者其他接口中,嵌套在另一个接口中的接口自动就是 public 的,而不能声明为 private 的。当实现某个接口时,并不需要实现嵌套在其内部的仁和街口。而且,private 接口不能在定义它的类之外被实现。 ----------- ### 8 . 接口和工厂 * 接口时实现多重继承的途径,而生成遵循某个接口的对象的典型方式就是工厂方法设计模式。我们将在工厂对象上调用的是创建方法,而该工厂对象将生成接口的某个实现的对象。理论上,通过这种方式,我们的代码将完全与接口的实现分离,这就使得我们可以透明的将某个实现替换为另一个实现。 * 对于创建类,几乎在任何时刻都可以替代为创建一个接口和一个工厂。 * 任何抽象性都应该是应真正的需求而产生的。 * 恰当的原则是应该优先选择类而不是接口,从类开始,如果接口的必须性变得十分明确,那么就应该进行重构。借口是一种重要的工具,但是他们容易被滥用。 ------------- 由本人从 Thinking in java ( java 编程思想 ) 整理而来 最后修改:2018 年 07 月 15 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 哇卡哇卡