前言
在学习了类、对象和继承后,这里将介绍两个比较高级的技术:接口与内部类。Java中的接口时Java灵活的基石,主要用来描述类可以具体有什么样的功能,但并不给出功能的具体实现。内部类是指在一个外部类的内部类再定义一个类。内部类作为外部类的一个成员,是依附于外部类而存在的。在编写图形类接口的时候,内部类有助于写出专业高效的代码。
接口的特性
Java中的接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征,没有方法的实现。因此,这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为或者功能。
在Java语言规范中,一个方法的特征仅包括方法的名字,参数的数目和种类,而不包括方法的返回类型,参数的名字以及抛出的异常。在Java编译器检查方法的重载时,会根据这些条件判断两个方法是否是重载关系。但在Java编译器检查方法的置换时,则会进一步检查返回类型和抛出的异常是否相同。
Java接口本身没有任何实现,只描述公共的行为,不涉及表象,所以Java接口比Java抽象类更抽象化。因为Java接口的方法只能是抽象的和公开的,所以lava接口不能有构造器,Java接口可以有 public、static和final属性。
接口把方法的特征和方法的实现分割开来。接口常常代表一个角色,它包装与该角色相关的操作和属性,而实现这个接口的类便是扮演这个角色的演员。一个角色由不同的演员来演,而不同的演员之间除了扮演一个共同的角色之外,并不要求其他共同之处。
使用接口可以实现类似于类的多重继承的功能。实现接口和实现继承的规则不同,一个类只有一个直接父类,但可以实现多个接口。
那么,为什么使用接口?假设这样一种情况,两个类中的两个类似的功能,调用他们的类动态地决定使用哪一种实现,为它们提供一个抽象父类,子类分别实现父类所定义的方法。问题在于,Java是一种单继承的语言,一般情况下,某个具体类可能已经有了一个超类,解决办法是给它的父类加父类,或者给它父类的父类加父类,直到移动到类等级结构的最顶端。这样一来,对一个具体类的可插入性的设计,就变成了对整个等级结构中所有类的修改。
一个等级结构中的任何一个类都可以实现一个接口,这个接口会影响到此类的所有子类,但不会影响到此类的任何超类。此类将不得不实现这个接口所规定的方法,而其子类可以从此类自动继承这些方法,当然也可以选择置换掉所有这些方法,或者其中的某些方法,这时候,这些子类具有了可插入性,并且可以用这个接口类型装载,传递了实现它的所有子类。
所以在接口中,我们关心的不是某一个具体的子类,而是这个子类是否实现了我们需要的接口。接口提供了关联以及方法调用上的可插入性,软件系统的规模越大,生命周期越长,接口使得软件系统的灵活性、可扩展性和可插入性得到保证。
2019/1/1013:17