总结一下自己对接口的了解。 我理解的接口是只能定义方法的声明的一些特殊类,而且所有的方法都含有公有(public)的访问权限。 使用接口的好处都有什么呢?首先,接口好比是一个基本能力概况的定义,因为它定义了那些实现该接口的类所必须要实现的一个或一组方法,也就是说,该接口的实现类必须实现该接口的所有方法,否则仍然不能实例化这个类。第二,多继承,比如java,c#语言规定可以继承多个接口,但不可以继承多个类。那么继承多个类会导致什么问题呢?我理解最明显的就是多个没有关系的类中,可能有相同方法的定义(名称、参数类型,参数顺序相同),如果一个类同时继承这几个类,那么无论是在子类中重写父类中的这些方法,还是调用子类的实例中的这些方法,都会是计算机执行(可能是编译)时产生错误,而且人们对这种思路的理解也会产生误解。 但是接口允许多继承,为什么呢?在这方面接口和类有什么区别么? 接口中止定义了方法的声明,而没有(也不能有)方法的具体实现。所以可以想象,即使多个没有任何关系的接口之中有相同的方法声明,也无所谓,因为都是要由这个实现类来实现这些方法。这样,一、实现类不是重写接口中的方法,而是第一次实现这些方法的具体业务逻辑。二、当调用这个实现类的实例中的这些方法的时候,即使在多个接口中都有这个方法的声明也无所谓,不会因此而产生歧义,因为接口中只定义了方法的声明,方法的具体实现在这个类中,有且只有一个版本(暂没有考虑重载)。 第三,这是我认为最终要的,也是我刚刚理解的。举个例子
interface A{ // 首先在接口中声明两个方法,这样实现类就必须完整的实现这两个方法 void print(); void printline(); }
public class A1 implements A{ public void print(){ System.out.print("print Class A1"); } public void printline(){ System.out.println("print line Class A1"); } }
public class A2 implements A{ public void print(){ System.out.print("print Class A2"); } public void printline(){ System.out.println("print line Class A2"); } }
public class Test{ public static void main(){ A a1=new A1(); A a2=new A2(); a1.print(); a1.printline(); a2.print(); a2.printline(); } } 可以这样理解,某个业务逻辑可能由多个类似的实现版本,这些实现可能具体的逻辑不一样,但是整个执行流程却是相同的。比如做饭,无论是大米饭,还是小米饭,还是高粱米饭,做饭的流程都是一样的,只是具体的材料、时间有所差别。要针对这种逻辑写程序时,使用接口是最方便的了。由接口定义业务的工作流程,然后由实现类定义具体的实现(比如放什么米,做多久)。当测试使用的时候,只要声明接口的变量,即可被赋值为实现类的对象,通过这个变量可以调用实现类实现了的该接口的所有方法。当有多个实现类时,只要给变量赋予不同实现类的对象即可。
(未完,待序,呵呵)