Lesson 10,Interfaces
接 口
LiFan(李凡)
Chengdu University of Information Technology
The Department Of Computer Science
2005
Interfaces and Classes (接口与类 )
? 类 (Class)是 Java语言编程的基本单位,但并不是面
向对象设计 (OOD)的基本单位,因为类不仅提供
设计,而且提供了实现
? 面向对象设计的基本单位是类型 (Type),类型只关
注行为的需求,并不限制行为的具体实现
? Java语言使用接口 (Interface)来定义类型,接口只
提供方法的声明,并不提供方法的实现,方法的
实现由接口的实现类提供
? 在 Java语言中,接口是一种纯粹的设计组件
单亲继承与多亲继承
? Java语言中,类 (Class)只支持单亲继承,一
个类只能有唯一的父类
? Java语言中,接口 (Interface)可支持多亲继
承,一个接口可以有多个父接口,子接口拥
有所有父接口中声明的方法
Supertypes and Subtypes
? 一个类的父类和实现的所有接口都称为这个
类的 超类型 (Supertype),而这个类称为其超
类型的 子类型 (Subtype)
? 子类型的对象引用可以造型成其任意超类型
(类或接口 )的对象引用,这就是对象的 多态

? 通过接口类型的对象引用只能访问接口中声
明的成员
Declaring Interfaces
? 声明接口的语法如下,
<修饰符 > interface <接口名 >{
… 接口成员声明 …
}
? 接口名 的命名规范与类相同,接口也可以指
定所属的包
Interface Modifiers
? 接口的修饰符 可以有以下几种,
(1) public — 与类的 public修饰符相同
(2) abstract — 通常被省略,因为接口中的
方法都是抽象的
(3) strictfp — 通常并不能限制接口中方法的
实现,一般不使用
Members of Interface
? 接口中可以声明以下成员,
(1) 域
(2) 方法
(3) 嵌套类和嵌套接口
? 接口中的成员都是 public的,不能指定其它的访问
控制修饰符
? 接口中的 域 默认是 static final的,必须显式初始化
? 接口中的 方法 只能提供方法头声明,不能提供实现,
且除 abstract外,不能使用其它修饰符
Interface Verbose{
int SILENT = 0;
int TERSE = 1;
int NORMAL = 2;
int VERBOSE = 3;
void setVerbose(int level);
int getVerbosity();
}
命名常量
方法声明
Extending Interfaces (接口的继承 )
? 接口支持多亲继承,可以在关键字 extends后面跟
多个接口的列表,中间用逗号隔开,如,
public interface SerializableRunnable
extends java.io.Serializable,Runnable
{ …… }
? 子接口拥有所有父接口中声明的方法
? 子接口中的域将隐藏父接口中声明的同名域,被
隐藏的父接口中的域必须通过父接口名访问
interface X{
int val=1;
}
interface Y extends X{
int val=2;
int sum=val+X.val;
}
接口中的方法覆盖和重载
? 接口中的方法可以重载 (Overload),可以声
明方法名相同但签名不同的多个方法 (包括
父接口中的方法 )
? 接口中的方法也可以覆盖 (Override),但没
有实际的意义,因为接口中不提供方法的实

? 应注意接口的实现类对某个覆盖方法的实现
是否能满足不同接口对该方法的语义要求
interface CardDealer{
void draw();
void deal();
void shuffle();
}
interface GraphicalComponent{
void draw();
void draw(Device d);
void rotate(int degrees);
void fill(Color c);
}
interface GraphicalCardDealer
extends GraphicalComponent,CardDealer{
……
}
Implementing Interfaces
? 要定义接口的实现类,需在类头中使用关键
字 implements,基本语法如下,
<修饰符 > class <类名 > implements <接口列表 >
? 类可以实现多个接口,接口列表中各个接口
名之间用逗号间隔
? 类必须提供接口中所有方法的实现,如果有
方法在类中没有实现,则类必须声明为抽象

interface IA{
void ma();
void mb();
}
interface IB extends IA{
void mb();
void mc();
}
class CA implements IB{
public void ma(){ … }
public void mb(){ … }
public void mc(){ … }
}
abstract CB implement IB{
public void ma(){ … }
public void mc(){ … }
}
Marker Interfaces (标记接口 )
? 不声明任何成员的接口称为标记接口
? 标记接口是一种退化的类型,因为标记接口不声
明任何的成员,主要用于表示接口的实现类具有
某种一般的属性
? Java语言的类库中提供了许多标记接口,
java.lang.Cloneable
java.io.Serializable
java.io.Externalizable
java.rmi.Remote
Assignments (作业 )
? 已知接口 X,Y如上所示,能否声明接口 Z同
时继承接口 X和 Y,如果不能,请说明原因
interface X{
int val=100;
}
interface Y{
String val=“a string”;
}
interface Z extends X,Y{
……
} //合法吗???