P.3.2 实现一个接口
实现接口的任何类,必须在类定义的开头使用implements子句进行说明。例如,如果类Circle实现了接口Measurable,它的开头就是下面这种形式:
然后,类必须定义接口中声明的每个方法。在本例中,类Circle必须至少实现方法getPerimeter和getArea。
如果写一个实现Measurable的类Square,这个类的开头应该是这样的:
且它至少应该定义方法getPerimeter和getArea。显然,这两个方法的定义不同于它们在类Circle中的定义。
图P-3展示了包含Measurable、Circle、Square以及它们的客户的文件。
注:写接口是类的设计人员向其他程序员说明方法的一种方式。实现接口是程序员确保类已经定义了某些方法的一种方式。
注:不同的类或许以不同的方式实现同一个接口。例如,可以有多个类都实现接口Measurable,且为方法getPerimeter和getArea写各自的版本。
示例。想象用于圆、球体和圆柱体等不同几何形状的类。其中的每一个几何体都有一个半径。我们可以定义下列接口,让类来实现它:
接口能知道已经定义了半径,所以为这个量声明set方法和get方法。但是,不能为半径声明数据域。实现接口的类来做这件事。
实现这个接口的类Circle如下所示:
类定义了一个私有数据域radius,且实现了接口Circular中声明的方法setRadius和getRadius。接口中不能含有像radius这样的数据域,因为它是私有的。
注:类中定义的方法数可以超出它实现的接口中声明的方法数。例如,类Circle定义了方法getArea,它没有包含在接口Circular中。
多个接口。类可以实现多个接口。如果想这样做,只需列出所有的接口名,并以逗号分隔即可。如果类是从另一个类派生而来的,则implements子句永远在extends子句的后面。所以,可以写
要想记住这个次序,只需记住保留字extends和implements在类头中以字母序出现即可。
实现多个接口的类必须定义接口中声明的每个方法。如果在类实现的多个接口中出现了相同的方法头,则类中只需定义一个即可。
不能从多个基类派生一个类。这个限制避免了实现继承时可能出现的冲突。但Java接口含有方法的规格说明,但不实现它们。类可以实现这些规格说明,而不管它们出现在一个接口中还是出现在多个接口中。通过允许类来实现多个接口这种机制,Java既实现了多重继承,又去掉了它可能引起的混乱。
自测题5 写一个Java接口,它定义学生类并声明其中的方法。
自测题6 定义一个类,规范实现前一个问题中你写的接口。要包含数据域、构造方法及至少一个方法的定义。