​ 本没有计划整理这个抽象类或者接口的知识点的,因为这两个概念非常的简单了,无非是对类的抽象和高度抽象。但是在读过Java9的源码之后,因为增加了default关键字,所以,整理一下这个知识点。

接口

​ 在类里,使用继承来描述一个类遵循接口的定义并不太合适,因为调用该接口的类与这个接口并没有实际的包含关系,即is-a的关系,所以,使用一个类实现了某个接口更为合适。

​ 使用abstract显式定义抽象类,使用interface定义接口。interface定义的接口是更加抽象的抽象类。接口中的方法可以通过default关键字定义为可包含方法实体的方法,否则只能够包含方法声明。接口中的方法隐式的声明为public,尽量将其显式声明。接口内的成员变量都被隐式声明为public,static,final,并且需要显式初始化,成员变量为常量(大写,使用_间隔词语)。

​ 让一个类遵循某个接口:使用inplements关键字,将接口的方法重新在类中声明定义。允许同一个接口具有多个不同的具体实现,常用策略设计模式。可以在任何类上添加新的接口,让方法接受接口类型,这是一种让任何类都可以对该方法进行适配的方式。

​ 接口不具备任何形式的类型,所以来自多个类型的类都是可以继承同一个接口的。

​ 接口可以多重继承。

​ 在导出类中,不强制要求必须有一个是抽象的或“具体的“(没有任何抽象方法的)基类。如果要从一个非接口的类继承,那么只能从一个类继承。其余的基元素必须是接口。需要将所有的接口名都置于inplements关键字之后,用逗号一一隔开。可以继承任意多个接口,并可以向上转型为每个接口,因为每个接口都是一个独立类型。换而言之,一个类可以继承多个接口,只要书写符合规范。接口也可以继承,通过继承接口产生新的接口。使用extends继承接口,并且可以继承多个接口,只要书写符合规范,即将接口名用逗号分隔。

​ 接口可以嵌套在类或其他接口中。实现某个接口时,不需要实现嵌套在其内部的任何接口,private接口不能在定义它的类之外实现。

​ 在打算组合的不同接口中使用相同的方法名会造成代码的可读性的混乱。

抽象类

​ 抽象类(抽象基类):含有抽象方法的类,当一个类含有一个或多个抽象方法,该类必须被限定为抽象(abstract)的。建立一个基类,这个基类仅提供接口,即创建类的通用部分,表示所有导出类的共同部分。这个类的对象没有实际意义,因为类只是表示一个接口,没有具体的实现内容,不同的子类可以用不同的方式表示这些接口。

​ 继承时候,抽象类的抽象方法需要在导出类全部重写,否则导出类也是抽象类,直到所有的抽象方法全部被重写。

​ 抽象类内是可以不含有抽象方法的,也就是可以含有可实现的方法,但是不能实例化。

​ 抽象方法:方法使用abstract声明,抽象方法是不完整的,仅有方法声明,没有方法体。

​ 抽象类的继承同一般类的继承,使用extends。这点不同于接口。

辨析

相同点

1
2
* 都不能被直接实例化,都可以通过继承实现其抽象方法。
* 都是面向抽象编程的技术基础,实现了诸多的设计模式。

不同点

1
2
3
4
5
6
7
8
* 接口支持多继承;抽象类不能实现多继承。
* 接口只能定义抽象规则;抽象类既可以定义规则,还可能提供已实现的成员。
* 接口是一组行为规范;抽象类是一个不完全的类,着重族的概念。
* 接口可以用于支持回调;抽象类不能实现回调,因为继承不支持。
* 接口只包含方法、属性、索引器、事件的签名,但不能定义字段和包含实现的方法(非default定义);抽象类可以定义字段、属性、包含有实现的方法。
* 接口可以作用于值类型和引用类型;抽象类只能作用于引用类型。例如,Struct就可以继承接口,而不能继承类
* 接口定义不同类型之间的类的方法;抽象类只定义了子类可以使用的方法。
* 接口中的方法都具有public的访问权限;抽象类里的方法可以具有正常类的访问权限。
查看更多

Java基础:Java基础