设计良好的软件系统应该具备“可复用性”和“可扩展性”,能够满足用户需求的不断变更。使用抽象类和接口是实现“可复用性”和“可扩展性”重要的设计手段。
接口与抽象类一样都不能被实例化
抽象类
Java语言提供了两种类:一种是具体类;另一种是抽象子类。
在Java中抽象类和抽象方法的修饰符是abstract,声明抽象类Figure
public abstract class Figure { // 绘制几何图形方法 public abstract void onDraw(); }
声明抽象类,在类前面加上abstract修饰符。行声明抽象方法,方法前面的修饰符也是abstract,注意抽象方法中只有方法的声明,没有方法的实现,即没有大括号({})部分。
注意 如果一个方法被声明为抽象的,那么这个类也必须声明为抽象的。而一个抽象类中,可以有0~n个抽象方法,以及0~n具体方法。设计抽象方法目的就是让子类来实现的,否则抽象方法就没有任何意义。
接口
比抽象类更加抽象的是接口,在接口中所有的方法都是抽象的。
提示Java 8之后接口中新增加了默认方法,因此“接口中所有的方法都是抽象的”这个提法在Java8之后是有待商榷。
接口与多继承
在C++语言中一个类可以继承多个父类,但这会有潜在的风险,如果两个父类有相同的方法,那么子类将继承哪一个父类方法呢?这就是C++多继承所导致的冲突问题。
在Java中只允许继承一个类,但可实现多个接口。通过实现多个接口方式满足多继承的设计需求。如果多个接口中即便有相同方法,它们也都是抽象的,子类实现它们不会有冲突。
接口继承
Java语言中允许接口和接口之间继承。由于接口中的方法都是抽象方法,所以继承之后也不需要做什么,因此接口之间的继承要比类之间的继承简单的多。
归纳抽象类与接口区别如下:
- 01. 接口支持多继承,而抽象类(包括具体类)只能继承一个父类。
- 02. 接口中不能有实例成员变量,接口所声明的成员变量全部是静态常量,即便是变量不加publicstatic final修饰符也是静态常量。抽象类与普通类一样各种形式的成员变量都可以声明。
- 03. 接口中没有包含构造方法,由于没有实例成员变量,也就不需要构造方法了。抽象类中可以有实例成员变量,也需要构造方法。
- 04. 抽象类中可以声明抽象方法和具体方法。Java 8之前接口中只有抽象方法,而Java 8之后接口中也可以声明具体方法,具体方法通过声明默认方法实现。
在多数情况下接口不能替代抽象类,例如当需要维护一个对象的信息和状态时只能使用抽象类,而接口不行,因为维护一个对象的信息和状态需要存储在实例成员变量中,而接口中不能声明实例成员变量。
版权声明:
一、本站致力于为软件爱好者提供国内外软件开发技术和软件共享,着力为用户提供优资资源。
二、本站提供的所有下载文件均为网络共享资源,请于下载后的24小时内删除。如需体验更多乐趣,还请支持正版。
三、我站提供用户下载的所有内容均转自互联网。如有内容侵犯您的版权或其他利益的,请编辑邮件并加以说明发送到站长邮箱。站长会进行审查之后,情况属实的会在三个工作日内为您删除。
如若转载,请注明出处:https://www.quange.cc/note/java/java-books-note/1361.html
共有 0 条评论