接口 (Interface)
在Java 中用 implement 来做。
接口中的方法只有定义,没有实现,而且默认都是public 的形式。
接口中不能定义变量。可以定义常量。
Java中的interface:代码中的 List , Set, Map, Queue 叫做 interface。而后面的 ArrayList, LinkedList 则是这个interface的实现方式。所以前面一定是 List, Set, Map, Queue。后面你想用什么方式实现都可以。
采用interface的原因是,如果一个函数是以 ArrayList 作为传入参数的,那么就不可能接受 LinkedList 作为其参数。所以就需要一个一模一样的函数(除了将传入参数改为 LinkedList)。这样就增大了代码的维护难度。所以就需要一个类似 衣服 一样的东西,将 ArrayList 或者 Linkedlist 包装一下,这样就避免了函数不识别的尴尬处境。
其实接口和抽象类的作用是基本相同的。Java中引入接口的目的是因为Java中继承只能是单一继承。所以如果一个类要实现别的特征的话,必须使用接口来实现。
C++ 中没有接口的原因是,C++ 中的继承是多继承。所以只用抽象类就可以实现所有操作了。
抽象类 (Abstract)
如果将一个类定义为抽象类,则这个类就不能生成一个具体的类。
那么为什么要将一个类定义为抽象类?
当我们认为某个类没有什么具体的意义,其对象都是以含有某些具体特征的类出现时,可以定义为抽象类。
或者子类都会覆盖基类中的方法。那么这些方法在基类中就不需要实现。
抽象类中的抽象方法不需要实现。而且只有抽象类中才有抽象方法,别的类中不能定义抽象方法。即,抽象类中可以有抽象方法和具体方法,但是具体类中不能有抽象方法。
子类中必须实现抽象类中所有抽象方法。
抽象类与接口的区别:
在很多情况下, interface 和 abstract class 是可以互换的。
但是如果用 interface,则不能有实现好的方法。所以当你新定义一个类时,就必须把某一个方法从头到尾都写一边。即使每个子类都会用到这个方法。但是在 Java 8 中,引入了 default 方法。default 方法和 abstract class 中已经实现好的方法的效果是一样的。
在 interface 中所有方法都是public , 如果不想暴露给外部,则需要用 abstract class。
如果一个类要实现很多功能的时候,要用interface。因为继承只能是单继承。比如 LinkedList 既是一个 List,又是一个 Queue。所以 List Queue只能定义成 interface,不能定义成 abstract class