Java中接口和抽象类

来源:互联网 发布:mac文件导入移动硬盘 编辑:程序博客网 时间:2024/04/28 10:17

浅析Java中的接口和抽象类


一、抽象类

1 抽象方法

只有声明,没有具体实现;

抽象方法必须用abstract关键字修饰,声明格式为:

abstract void fun();


2 抽象类

2.1 若一个类含有抽象方法,则该类称为抽象类;

注意:抽象类中可以没有抽象方法,只要用abstract修饰就认为是抽象类;

2.2 抽象类必须在类前用abstract关键字修饰;

抽象类不能创建对象,因为抽象类中可能含有抽象方法;

[public] abstract class ClassName{abstract void fun();}

2.3 包含抽象方法的类是抽象类,但并不意味抽象类只能有抽象方法,其和普通类一样,可拥有成员变量和普通的成员方法;

2.4 抽象类和普通类的区别:

抽象方法必须是public(默认)或protected,因为private是不能被子类继承的,即子类无法实现该方法;

抽象类不能用来创建对象;

若一个类继承于一个抽象类,则子类必须实现父类所有的抽象方法;若子类没有实现父类的抽象方法,则必须将子类也定义为abstract类;


二、接口

1 接口概念

接口是对行为的抽象;定义接口形式如下:

[public] interface InterfaceName{}


2 接口中的成员变量/方法

接口中可以含有变量和方法,但接口中的变量被隐式地指定为且只能是public static final变量,接口中的方法被隐式地指定为且只能是public abstract方法,即接口中的所有方法都不能有具体实现——抽象方法;

注意:接口是一种极度抽象的类,比抽象类更抽象,且一般不在接口中定义变量;


3 接口实现

一个类遵循某组接口需要使用implements关键字,格式如下:

class ClassName implements Interface1, [Interface2, ...]{}

允许一个类实现多个接口;

若一个非抽象类实现某个接口,必须实现接口的所有抽象方法;

若一个抽象类实现某个接口,可不实现接口中的抽象方法;


三、抽象类和接口的区别

1 语法层面上

1.1 抽象类可提供成员方法的具体实现,接口中只能存在public abstract方法

1.2 抽象类中的成员变量可以是各种类型的,接口中的成员变量只能是public static final类型的

1.3 抽象类可含有静态代码块和静态方法,接口中不能含有静态代码块和静态方法

1.4 一个类只能继承一个抽象类,但可实现多个接口


2 设计层面上

2.1 抽象类是对整个类的抽象,接口是对类局部(行为)的抽象

继承是“是不是“的关系,若一个类继承某个抽象类,则子类必定是抽象类的种类,

接口实现则是“有没有”、”具备不具备“的关系;

2.2 抽象类作为很多子类的父类,是一种模板式设计;

接口作为规范,是一种辐射式设计;


四、举例(具体见原博文)

Door的open() 、close()和alarm()根本就属于两个不同范畴内的行为,open()和close()属于门本身固有的行为特性,而alarm()属于延伸的附加行为。

最好的解决办法是单独将报警设计为一个接口,包含alarm()行为,Door设计为单独的一个抽象类,包含open和close两种行为。再设计一个报警门继承Door类和实现Alarm接口。

interface Alram {    void alarm();}abstract class Door {    void open();    void close();}class AlarmDoor extends Door implements Alarm {    void oepn() {      //....    }    void close() {      //....    }    void alarm() {      //....    }}




注明:此文章是转载海子的博文,详情见:http://www.cnblogs.com/dolphin0520/p/3811437.html


0 0