第4章 接口抽象类与包.docx
- 文档编号:2990300
- 上传时间:2022-11-16
- 格式:DOCX
- 页数:20
- 大小:31.45KB
第4章 接口抽象类与包.docx
《第4章 接口抽象类与包.docx》由会员分享,可在线阅读,更多相关《第4章 接口抽象类与包.docx(20页珍藏版)》请在冰豆网上搜索。
第4章接口抽象类与包
第4章接口、抽象类与包
构造Java语言程序有两大基本构件:
类和接口。
事实上,程序设计的任务就是构建各种类和接口,并由它们组装出程序。
接口由常量和抽象方法构成。
一个接口可以扩展多个接口,一个接口也可以被多个接口所继承。
在Java中,抽象类可以用来表示那些不能或不需要实例化的抽象概念,抽象需要被继承,在抽象类中包含了一些子类共有的属性和行为。
抽象类中可以包含抽象方法,抽象类的非抽象的继承类需要实现抽象方法。
在Java语言中可以把一组相关类和接口存放在一个“包”中,构成一个“类库”,然后供多个场合重复使用,这种机制称为类复用。
类复用体现了面向对象编程的优点之一。
每个Java包也为类和接口提供了一个不同的命名空间,一个包中的类和接口可以和其它包中的类和接口重名。
4.1接口
在Java语言中,接口是一个特殊的语法结构,其中可以包含一组方法声明(没有实现的方法)和一些常量。
接口和类构成Java的两个基本类型,但接口和类有着不同的目的,它可用于在树形层次结构上毫不相关的类之间进行交互。
一个Java类可以实现多个Java接口,这也解决了Java类不支持多重继承带来的弱点。
4.1.1接口定义
Java接口的定义方式与类基本相同,不过接口定义使用的关键字是interface,其格式如下:
publicinterfaceInterfaceNameextendsI1,...,Ik//接口声明
{//接口体,其中可以包含方法声明和常量
...
}
接口定义由接口声明和接口体两部分组成。
具有public访问控制符的接口,允许任何类使用;没有指定为public的接口,其访问将局限于所属的包。
在接口定义中,InterfaceName指定接口名。
在接口定义中,还可以包含关键词extends,表明接口的继承关系,接口继承没有唯一性限制,一个接口可以继承多个接口。
位于extends关键字后面的I1、…、Ik就是被继承的接口,接口InterfaceName叫I1、…、Ik的子接口(subinterface),I1、…、Ik叫InterfaceName的父接口(superinterface)。
由一对花括号{}栝起的部分是接口体,其中定义抽象方法(abstractmethods参见4.2小节)和常量。
在接口内也可以嵌套类和接口的定义,不过这并不多见。
在接口体中,方法声明的常见格式如下:
ReturnTypeMethodName(Parameter-List);
此方法声明由方法返回值类型(ReturnType)、方法名(MethodName)和方法参数列表(Parameter-List)组成,不需要其它修饰符。
在Java接口中声明的方法,将隐式地声明为公有的(public)和抽象的(abstract)。
由于接口没有为其中声明的方法提供实现,在方法声明后会需要一个分号。
如果把分号换成一对花括号{},即使花括号{}中没有任何内容,也表示一个方法被实现,只是这是一个没有任何操作的空方法。
在Java接口中声明的变量其实都是常量,接口中的变量声明,将隐式地声明为public、static和final,即常量,所以接口中定义的变量必须初始化。
interfaceMyInterface{
//变量a声明不合法,a为常量,必须初始化
inta;
//下面的变量声明,等同于publicstaticfinalintb=200;
intb=200;
//下面的方法声明,等同于publicabstractvoidm();
voidm();
}
和类不同,一个Java接口可以继承多个父接口,子接口也可以对父接口的方法和变量进行覆盖。
例如:
interfaceA{
intx=1;
voidmethod1();
}
interfaceB{
intx=2;
voidmethod2();
}
interfaceCextendsA,B{
intx=3;
voidmethod1();
voidmethod2();
}
在该例中接口C的常量x覆盖了父接口A和B中的常量x,方法method1()覆盖了父接口A中的方法method1(),方法method2()覆盖了父接口B中的方法method2()。
和类还有一个重要的区别,在Java接口中不存在构建器。
4.1.2接口的实现
Java接口中声明了一组抽象方法,它构成了实现该接口的不同类共同遵守的约定。
在类定义中可以用关键字implements来指定其实现的接口。
一个类实现某个接口,就必须为该接口中的所有方法(包括因继承关系得到的方法)提供实现,它也可以直接引用接口中的常量。
例4.1.1Example.java
interfaceA{
intx=1;
voidmethod1();
}
interfaceBextendsA{
intx=2;
voidmethod2();
}
publicclassExampleimplementsB{
publicvoidmethod1(){
System.out.println("x="+x);
System.out.println("A.x="+A.x);
System.out.println("B.x="+B.x);
System.out.println("Example.x="+Example.x);
}
publicvoidmethod2(){
}
publicstaticvoidmain(String[]args){
Exampled=newExample();
d.method1();
}
}
程序运行结果:
x=2
A.x=1
B.x=2
Example.x=2
在上面的例子中类Example实现了接口B,它为接口B中声明的方法method2()提供了实现,虽然method2()的方法体为空。
在类Example中,还要实现接口B继承接口A得到的方法method1()。
从类Example的方法method1()中,可以引用其实现接口B而继承的变量x,此变量属于类成员,我们也可以通过类名来引用。
√Java类只允许单一继承,即一个类只能继承(extends)一个父类;但一个类可以实现多个接口,Java支持接口的多重继承。
在Java类定义中,可以同时包括extends子句和implements子句,如果存在extends子句,则implements子句应跟随extends子句后面。
Java接口常用于不同对象之间进行通信,接口定义对象之间通信的协议,下面通过一个具体的例子来说明。
例4.1.2EventProducer.java
importjava.util.Vector;
//事件
classSimpleEvent{
}
//凡需要处理SimpleEvent事件的监听器,要求实现该接口
interfaceEventListener{
voidprocessEvent(SimpleEvente);
}
//SimpleEvent事件的监听器,实现EventListener接口
classEventConsumerimplementsEventListener{
publicvoidprocessEvent(SimpleEvente){
System.out.println("Receiveevent:
"+e);
}
}
//事件源,产生SimpleEvent事件
publicclassEventProducer{
//对象容器,存储事件监听器
Vectorlisteners=newVector();
//事件监听器向事件源注册自身
publicsynchronizedvoidregisteListener(EventListenerlistener){
listeners.add(listener);
}
publicvoiddemo(){
SimpleEvente=newSimpleEvent();
for(inti=0;i EventConsumerconsumer= (EventConsumer)listeners.elementAt(i); consumer.processEvent(e); } } publicstaticvoidmain(String[]args){ EventProductorproductor=newEventProductor(); EventConsumerconsumer=newEventConsumer(); productor.registeListener(consumer); productor.demo(); } } 程序运行结果: Receiveevent: SimpleEvent@9cab16 4.1.3接口作为类型 和类一样,Java接口也是一种数据类型,可以在任何使用其他数据类型的地方使用接口名来表示数据类型。 我们可以用接口名来声明一个类变量、一个方法的形参或者一个局部变量。 用接口名声明的引用型变量,可以指向实现该接口的任意类的对象。 例如: 例4.1.3Server.java classWorkerimplementsRunnable{ publicvoidrun(){ System.out.print("Workerrun! "); } } publicclassServer{ publicstaticvoidmain(String[]args){ Runnablew=newWorker(); (newThread(w)).start(); } } 程序运行结果: Workerrun! 该例中的Runnable是Java语言包中的一个非常重要接口,Worker是实现了Runnable接口的类,在程序中我们创建了Worker对象,并赋给了声明为Runnable类型的变量w。 有关本例中使用的接口Runnable和类Thread,可参见本书第10章多线程。 4.1.4接口不应改变 一个接口声明了方法,但没有实现它们。 位于树型结构中任何位置的任何类都可以实现它,实现某个接口的类,要为这个接口中的每个方法提供具体的实现,由此形成某些一致的行为协议。 如果有一天,你想修改某个接口,为其添加一个方法,这个简单的修改可能会造成牵一发而动全身的局面: 所有实现这个接口的类都将无法工作,因为现在他们已经不再实现这个接口了。 你要么放弃对这个接口的修改,要么连同修改所有实现这个接口的所有类。 在设计接口的最初,预测出接口的所有功能,这可能是不太现实。 如果觉得接口非改不行,可以创建一个新的接口或者扩展这个接口,算是一种折衷的解决方法。 其他相关的类可以保持不变,或者重新实现这个新的接口。 4.2抽象类 在面向对象的概念中,所有的对象都是通过类来描述的,但并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。 抽象类往往用来表征我们在对问题领域进行分析、设计中得出的抽象概念,是对一系列看上去不同,但是本质上相同的具体概念的抽象。 如果我们要开发一个作图软件包,就会发现问题领域存在
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第4章 接口抽象类与包 接口 抽象
![提示](https://static.bdocx.com/images/bang_tan.gif)