接口和内部类为我们提供一种将接口与实现分离的更加结构化的方法。
抽象类似普通类和接口之间的一种中庸之道。
1.抽象类和抽象方法
-
Java提供一种
抽象方法
机制,这种方法是不完整的,仅有声明而没有方法体abstract void f();
包含抽象方法的类叫做
抽象类
。如果一个类包含一个或多个抽象方法,该类必须向定位抽象的。(否则编译器会报错)如果从一个抽象类继承,并想创建该类的对象,那么就必须为基类的所有抽象方法提供方法定义。如果不这样做(可以选择不做),那么导出类也是抽象的,却编译器将会强制我们用
abstract
关键字来限定这个类。如果一个类,让其包含任何abstract方法都显得没有实际意义,而且我们也想要阻止产生这个类的任何对象,那么这个类可以是
一个没有任何抽象方法的抽象类
。抽象类是很有用的重构工具,因为它们使得我们可以很容易地将公共方法沿着继承层次结构向上移动、
2.接口
-
interface
关键字产生一个完全抽象的类,允许创建者确定方法名,参数列表和返回类型,但是不提供任何的具体实现。 - 接口被用来建立类和类之间的
协议
。 - 接口是一个极度抽象的类,因为它允许人们通过创建一个能够被向上转型为多种基类的类型,来实现某种类似多重继变钟的特性。
- 接口的域都是隐式地
static
和final
。 - 接口中的方法默认为
public
。
3.完全解耦
4.Java中的多重继承
-
使用接口的核心原因:
- 为了能够向上转型为多个基类型;
- 防止客户端程序员创建该类的对象,并确保着仅仅是建立一个接口。
事实上,如果知道某事物应该成为一个基类,那么第一选择应该使是他成为一个接口。
5.通过继承来拓展接口
通过继承,可以很容易地在接口中添加新的方法声明,还可以通过继承在新接口中组合数个接口。
在打算组合的不同接口中使用相同的方法名通常会造成
代码可读性
的混乱。
6.适配接口
- 接口允许具有多个不同的具体实现。
- 接口的一种常见用法是
策略
设计模式。
7.接口中的域
- 接口中的任何域都是
static
和final
的,因此接口成为了一种很便捷的用来创建常量组的工具。在Java SE5之后,可以使用更加强大而灵活的enum
。 - 接口中定义的域不能是“空final”,但是可以被非常量表达式初始化。
- 这些域不是接口的一部分,它们的值被存储在该接口的静态存储区域内。
8.嵌套接口
- 接口可以嵌套在类或其他接口中。
9.接口和工厂
- 接口是实现多重继承的途径,而生成遵循某个接口的对象的典型方式就是
工厂方法
设计模式。