抽象
若某个类表达的是一种概念,一种共同属性的抽象集合,我们并不希望这个类的对象会被创建出来。那么,我们就应该把这个类定义为抽象的。我们用abstract关键字来定义抽象类。抽象类的作用仅仅是表达接口,而不是具体的实现细节。抽象类中可以存在抽象方法。抽象方法也是使用abstract关键字来修饰。抽象的方法是不完全的,它只是一个方法签名而完全没有方法体。
如果一个类有了一个抽象的方法,这个类就必须声明为抽象类。如果父类是抽象类,那么子类必须覆盖所有在父类中的抽象方法,否则子类也成为一个抽象类。一个抽象类可以没有任何抽象方法,所有的方法都有方法体,但是整个类是抽象的。设计这样的抽象类主要是为了防止制造它的对象出来。
接口
Java把抽象的概念又更推进了一步。这就是接口(Interface)。接口其实就是完全抽象的类,因此接口和类的地位是一样的,此前所有针对类的所有法则同样适用于接口。 接口很像C++中的纯虚函数。
接口所有的方法都是没有方法体的,而且都是public abstract,即使你没有这样声明。而接口中的所有成员变量都是public static final的变量,并且必须有定义初始化,因为所有变量都必须在编译的时候有确定值。
接口和类的地位是一样的。因此我们可以看到其定义方式跟类也是基本上一样的。当然,其中的所有方法都没有方法体。而当类从接口得到继承的时候,Java用另外一个动词:实现(implements)。当然,实现接口的类必须覆盖接口中所有的方法,否则这个类就成为一个抽象类。
Java不允许多继承,但是允许一个类实现多个接口,也允许一个接口从多个接口得到继承,但是不允许接口从类继承,也不允许接口实现接口。
面向接口的编程方式
设计程序时先定义接口,再实现类。
任何需要在函数间传入传出的一定是接口而不是具体的类。
是Java成功的关键之一,因为极适合多个人同时写一个大程序。
也是Java被批评的要点之一,因为代码量膨胀起来很快。