我想大致了聊一下我对接口的理解。
OOP的基本特性是:
封装与信息隐藏,继承与重写,多态、子类型、重载
首先先看几个概念。
一·类方法(类成员变量)与实例方法(实例成员变量)
类方法是指无须定义该类的对象即可使用,常见调用方法是:类名.类方法。
而在类中定义时只需在方法前外加static修饰即可完成对类方法的定义。
而实例方法是指类中那些必须要定义该类的一个实例对象才可以调用该方法
二·接口
Java中的接口是一个实现ADT的强有力的工具,提供整个ADT的框架抽象,确定ADT规约,定义ADT。
而类的具体设计和实现则完成了ADT的具体实现,接口相当于提供了ADT的蓝图,而不同的类则给出了ADT的不同实现。但在实际调用实例时,通过接口定义的ADT的方法完成相应操作,无需考虑ADT的具体实现,只需关心方法是否可以完成相应规约的功能即可。
接口之间可以继承与扩展
一个类可以实现多个接口(从而具备了多个接口中的方法)
–一个接口可以有多种实现类
当然也可以不需要接口直接使用类作为ADT,既有ADT定义也有ADT实现。
但是 实际中更倾向于使用接口来定义变量。
一个接口通常包括一个工厂方法代替构造器的功能,以及ADT所需的方法。
接口本身不具体实现ADT,没有具体数据结构和方法的实现,本身不可定义ADT的构造器,因为不同ADT实现导致其构造器实现不同
并且,在Java静态检查时就会对接口中定义的构造器进行报错。
但使用类中定义的构造器又会导致表示泄露,则最好方法使用静态工厂方法,返回一个新的实现了ADT的对象,但返回值是接口类型的ADT。
像这样。
我们也是通过这种方式来选择我们ADT的具体实现方式的(通过返回用不同方法实现ADT的对象)。
接口中的每一个定义的方法都必须在实现这个接口的类中有具体实现过程(Java的静态检查会保证)。我们在具体实现接口的类前用关键字implements来告诉编译器我们要实现这个接口
如这样。
三·接口与父类的一些相同点
我觉得接口与具体实现类的关系和父类与子类的关系很像,因为他们之间的相似之处有很多,像接口中的定义函数由具体类来实现,实际上就像是通过重写来实现,虽然是接口类型,但是却使用的是实现类中的方法。而子类重写了父类的方法,并用子类的构造器构造了父类的对象后(因为子类逻辑上包含于父类,就像用电动汽车类的构造器构造了车类的一个对象,这在逻辑上是说的过去的,它是电动汽车,它也就是车。),父类中的相应方法也替换为子类重写的父类的方法。父类也可以将一些实现多样化的方法直接简单的给出一个定义,而具体实现方式由子类来通过重写完成,称这为抽象方法。接口通过工厂方法中返回不同实现类来构造ADT,而父类通过不同的子类的构造器来完成自己不同方法的实现。接口定义的操作是ADT的所有必要操作,而很多父类中子类没有重写的方法也都是ADT中共有的操作,子类无需重写直接继承即可,只不过接口的抽象程度远远大于父类。它省略了几乎所有的具体ADT的实现方法,真正地只留下了一个“接口”。我喜欢将接口与具体实现类的关系归为父类与子类的一个极端例子。
以上仅是我对课上老师所讲的接口相关知识的理解,如果其中有错误的话,希望大家指正出来。