java 抽象类及接口

来源:互联网 发布:守望先锋低配置优化 编辑:程序博客网 时间:2024/05/16 07:23

接口和内部类为我们提供了一种将接口与现实分离的更加结构化的方法

一.抽象类和抽象方法

在介绍抽象类之前,我们先来了解一下抽象方法。抽象方法是一种特殊的方法:这种方法是不完整的,仅有声明而没有方法体。下面是抽象法法声明所采用的语法:
[public] abstract void f();

包含抽象方法的类叫做抽象类。如果一个抽象类包含一个或多个抽象方法,该类必须被限定为抽象的(否则编译会出错)
抽象类声明格式

class abstract className{    abstract void f();}

抽象类和抽象方法的使用规则:

1.抽象类必须使用abstrct修饰符来修饰,有抽象方法的类只能被定义成抽象类,抽象类里可以没有抽象方法。
2.抽象类不能被实例化,无法使用new关键字来调用抽象类的构造器创建抽象类的实例。及时抽象类里不包含抽象方法,这个抽象类也不能创建实例。
3.抽象类里可以包含成员变量、方法(普通方法和抽象法法都可以)、构造器、初始化模块、内部类(接口、枚举)5种成分。抽象类的构造器不能用于创建实例,主要是用于其子类调用。
4.含有抽象方法的类(包括直接定义了一个抽象方法;或继承了一个抽象父类,但没有完全实现父类包含的抽象方法;或实现了一个接口,但没有完全实现接口包含的抽象法法三种情况)只能被定义成抽象类

二.接口

接口定义的基本语法

[修饰符] interface interfaName {}

要让一个类遵循某组特地的接口需要使用implements关键字,具体格式如下:

[修饰符]class ClassName implements Interface1,Interface2,{  }

1) 修饰符可以是public或者省略,如果省略了public访问控制符,则默认采用包权限访问控制符,即只有在相同的包下才可以访问该接口
2)接口名英语类名采用相同的命名规则,即若果仅从语法角度来看,接口名只要是合法的标识符即可;不过为了代码可读性,接口名应有多个有意义的单词连缀而成,单词与单词之间无需任何分隔符。接口名通常能够使用形容词。
3)一个接口可以有多个直接父接口,但接口只能继承接口,不能继承类。

由于接口定义的是一种规范,因此接口里不能包含构造器和初始化块定义。接口里可以包含成员变量(只能是静态常量)、方法(只能是抽象实例方法、类方法或默认方法)、内部类(包含内部类接口。枚举)定义。

下面举一个网上比较广泛的例子:门和警报的例子:门都有open()和close()两个动作

抽象类定义:

abstract class Door{    public abstract void open();    public abstract void close();}

接口定义:

interface Door{    public abstract void open();    public abstract void close();}

现在给门加一个警报功能 alram()有以下两种思路:
1.如果定义在抽象类里边,那所有门都会有这种功能,但是育德门不具备这种方法,所以不妥。
2.如果这个功能放到接口里面,就需要实现接口中的open()和close()方法。
从这里可以看出, 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() {    }}

参考文档:https://www.cnblogs.com/dolphin0520/p/3811437.html
参考书籍:《疯狂java讲义》、《java编程思想》

原创粉丝点击