第八章 - 接口

2026/1/13 17:27:07

Java程序设计入门与精通

public static void main(String[] args){ Random rand=new Random(); Shape[] s=new Shape[9]; for(int i=0;i

由本例可见,一个类实现一个接口,必须给出接口中所有方法的实现。如果不能实现某方法,也必须写出一个空方法。Java允许多个类实现同一个接口,这些类之间可以是毫无联系的,每个类各有自己实现方法的细节。这一点与继承机制不同。同时一个类也能实现多个接口,这就解决了多重继承的问题。

8.2 抽象类

在Java中有一个与接口概念非常相似的概念,就是抽象类。在定义一个类的时候,经常会碰到这样的情况:有一些方法对于所有的对象都是合适的,但有些方法只对某个特定类型的对象才有意义。这些方法在这个类中是不能实现的,把这种类定义为抽象类。

8.2.1 什么是抽象类

抽象类往往用来表征在对问题领域进行分析、设计中得出的抽象概念,是对一系列看上去不同,但是本质上相同的具体概念的抽象。例如,某些类在现实世界中是不能直接找到其对应的实例的,如车这个类,不可能为它找到一个对应的事物,因为现实世界中只有汽车、自行车、火车等事物,而它们都是车的子类,不能说是车这个类的实例,这样的类称为抽象(abstract)类。

Java允许在类中只声明方法而不提供方法的实现。这种只有声明而没有方法体的方法称为抽象方法,而包含一个或多个抽象方法的类称为抽象类。 抽象类在使用上有特殊的限制,即不能创建抽象类的实例。正是为了阻止程序员创建抽象类的实例对象,使编译器在编译时刻对此进行检查,Java中要将抽象类和抽象方法带上abstract标记。如果抽象类的子类实现了抽象方法,则可以创建该子类的实例对象,否则该子类也是抽象类,也不能创建实例。

以abstract修饰的方法称抽象方法,所有的抽象方法都必须在抽象类或者接口中。抽象方法只有方法头而无方法体,它定义的格式如下:

abstract 返回值类型 方法名([形参]); //是否有形参,根据具体情况 例如:

132

第八章 接口

abstract float acceleration(float a);

在这个定义中没有用大括号括起的方法体,只是说明有这样一个方法,名字是什么、返回值怎样、有什么形参,具体如何实现这个方法需要定义它的子类的任务。

抽象方法是为子类定义一个共同的形式上相同的接口,这样做的好处是使调用该方法的程序不必关心各个子类的内部情况,而实现相同的调用格式,达到简化程序,逻辑清晰的目的。例如:

public abstract class shape {

public int r;

abstract public int area(); }

这是一个抽象类shape,它提供了所有子类需要的属性和方法,其中的抽象方法area()是求面积(体积)的意思,它只是提供了这个类的对外接口的模式,至于它的子类怎么计算,与它无关。而shape的非抽象子类,如Circle和Rectangle等都必须实现area()这个方法,但实现的方法体不一样,如Circle中是求面积,Rectangle中是求体积。

class Circle extends shape {

public int r;

Circle(int r){ this.r=r; }

public int area(){ return 3*r*r; } }

class Rectangle extends shape {

public int width,height; Rectangle(int w, int h) { width=w; height=h; }

public int area() { return width*height; } }

抽象类中既存在抽象方法,也存在一般方法,如果一个父类是抽象类,其非抽象的子类如何继承它的方法呢?抽象方法中一般方法的继承和普通的继承一样,只要该方法是非private的就可以继承。而对于父类中的抽象方法是通过覆盖的形式来实现继承的。就是在子类中定义一个与抽象方法有相同方法头的方法,并完成方法体的定义。可以把这个过程称为“实现\,

133

Java程序设计入门与精通

即子类实现了抽象类的某个方法。抽象类中可能有许多抽象方法,它的子类必须实现所有这些方法。这样要求的原因是,如果子类不全部实现父类的抽象方法,子类中就存在了从父类继承来的抽象方法,这和抽象方法只存在于抽象类中的规定不符。所以,如果子类没有实现全部的抽象方法,就必须仍定义为抽象类。这一点和接口的实现一样。而如果抽象类的子类也是抽象类,子类也可以去实现父类的抽象方法或定义更多的抽象方法,很灵活。

8.2.2 抽象类的作用

我们在上节接口中给出了一个关于几何形状Shape及其子类的例子。在这个类的层次结构中,Shape类是顶层类。实际上Shape类的对象是没有实际意义的。定义Shape类的目的并不是为了在程序中创建并操作它的对象,而是为了定义几何形状类体系的通用接口,例如draw()和erase(),这些接口在Shape类中不需要给出具体实现,而由它的各个子类提供自己的实现。因此Shape类可以定义为抽象类,而draw()和erase()方法可以定义为抽象方法,如图8-2所示。

abstract Shape abstract draw(); abstract erase(); Circle Square Rectangle 图8-2 抽象类Shape及其类体系

实际上,即使不包括任何抽象方法,也可将一个类声明为抽象类。这样的类往往是没有必要定义任何抽象方法,而设计者又想禁止创建该类的实例对象,此时只需在类的声明中加上abstract关键词。

定义抽象类和抽象方法可以向用户和编译器明确表明该类的作用和用法,使类体系设计更加清晰,并能够支持多态,因此是Java的一种很有用的面向对象机制。

8.2.3 接口与抽象类

通过上述对抽象类和接口的介绍,我们可以发现接口与抽象类有一定的相似性,但实际上这二者之间有很大的区别:

? 接口中的所有方法都是抽象的,而抽象类可以定义带有方法体的不同方法。 ? 一个类可以实现多个接口,而只能继承一个抽象父类。

? 接口与实现它的类不构成类的继承体系,即接口不是类体系的一部分。因此,不

相关的类也可以实现相同的接口。而抽象类是属于一个类的继承体系,并且一般

134

第八章 接口

位于类体系的顶层。 使用接口的主要优势在于:一是类通过实现多个接口可以实现多重继承,这是接口最重要的作用,也是使用接口的最重要的原因,能够使子类对象上溯造型为多个基础类(接口)类型;二是能够抽象出不相关类之间的相似性,而没有强行形成类的继承关系。使用接口,可以同时获得抽象类以及接口的优势。所以如果要创建的类体系的基础类不需要定义任何成员变量,并且不需要给出任何方法的完整定义,则应该将基础类定义为接口。只有在必须使用方法定义或成员变量时,才应该考虑采用抽象类。

8.3 包

8.3.1 什么是包

我们都熟悉Windows的文件组织方式:文件夹。同一文件夹中的文件不能重名,不同文件夹中的文件可以重名,如果没有文件夹的存在,将文件全部放在一起,则要求所有文件名必须是惟一的,否则会发生命名冲突,而且文件存放没有层次,杂乱无章。如果将相关文件按文件夹分门别类存放,则显得井井有条,便于查找,而且文件夹中还可以有子文件夹。

同样地,如果编写的程序代码较繁杂,参加编写的人员较多,很可能由于类的命名和引用问题引发冲突。为此,Java提供了一种叫做“包(Package)”的机制,从而避免了命名冲突的发生。所谓“包”就是一个区别类名字空间的机制,它是Java提供的类的组织方式。包对应一个文件夹,包中还可以有包,称为包等级。定义的类都加入某一个包中,并作为包的一部分存在,Java类中的成员变量和成员方法都在类中定义,使用包机制使每个Java的变量和方法都可以用全限定的名字来表示,即包括包名、类名和成员(方法和变量)名,各部分间用点号分隔即可。

简单地说,如果两个不同的程序员编写的代码在命名上有重复,又被放在了同一个名称空间内,必然会引发冲突。但包机制的引入将这些同名的标识符放在了不同的名称空间内,这样在使用时就可以很方便地区分,不会引发冲突了。如果源程序中没有声明类所在的包,Java将类放在默认的包中,这意味着每个类必须使用惟一的名字,否则会发生名字冲突,就像Windows同一文件夹中的同名文件一样。

在Java语言中,包的作用是很大的。包是实现封装的一种手段,也是限定类中方法和变量的作用域的一种手段。它为类和其他的子包提供了一个“容器”。这个容器针对不同的访问级别来确定具体的访问范围。

当类被声明为public时,其代码可以被任何其他代码访问;而类的访问控制设为默认时(即没有显式表明),则相当于friendly,可以被同一包中的其他代码访问。也就是说,定义类时如果没有设臵访问修饰符,这些类可以被该类所在包的其他类所访问,而对除此之外的所有类都不可见。

创建一个包非常简单,在Java源文件的最开始处包含一个package语句即可。包含package关键词的声明语法格式为: package包名;

package语句定义了一个存放类的命名空间,所有使用相同包名称的类都被归在同一个

135


第八章 - 接口.doc 将本文的Word文档下载到电脑
搜索更多关于: 第八章 - 接口 的文档
相关推荐
相关阅读
× 游客快捷下载通道(下载后可以自由复制和排版)

下载本文档需要支付 10

支付方式:

开通VIP包月会员 特价:29元/月

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信:xuecool-com QQ:370150219