JAVA中抽象类与接口的应用

时间:2022-03-30 06:51:59

JAVA中抽象类与接口的应用

摘 要:抽象类和接口是JAVA中两个非常重要的概念,它们的存在使JAVA面向对象的能力发挥得淋漓尽致。由于抽象类与接口在语法定义中有些相似之处,甚至在某些应用中可以相互替换完成相同的功能,因此经常被混淆。实际二者“形似神不似”,本论文通过介绍抽象类和接口的应用场合,论述两者的区别。

关键词:抽象类;接口;JAVA

中图分类号:TP312.1

抽象类和接口是JAVA中两个非常重要的概念,它们的应用体现了JAVA作为一门面向对象程序设计语言体现的多态性。两者在实际应用中经常被认为可以互相替换,以至被混淆。本论文通过实例详细介绍了抽象类和接口的应用场合和使用方法,帮助读者设计出更高效、更健壮的JAVA程序。

1 抽象类

在设计程序时,经常会用到abstract类。其原因是,abstract类只关心操作,但不关心这些操作具体的实现细节,可以使程序设计者把主要精力放在程序设计中,而不必拘泥于细节的实现。例如,在设计地图时,首先考虑地图最重要的轮廓,不必去考虑城市中的街道牌号等细节,细节应当由抽象类的非抽象子类去实现。使用多态进行程序设计的核心技术之一是使用上转型对象,即将abstract类声明的对象作为其子类对象的上转型对象,它可以调用子类重写的方法[1]。

1.1 抽象类的定义。用关键字abstract修饰的类称为abstract类(抽象类),例如:

abstract class Shape{

……

}

用关键字abstract修饰的方法称为abstract方法(抽象方法),例如:

abstract int min(int x,int y);

对于abstract方法,只允许声明,不允许实现(即没有方法体),而且不允许使用final和abstract同时修饰一个方法,也不允许使用static修饰abstract方法。

(1)abstract类与abstract方法的关系。和普通类相比,abstract类中可以有abstract方法(普通类中不允许有抽象方法),也可以有非abstract方法;(2)abstract类不能被实例化。对于abstract类,不能用new运算符创建该类的对象,只能被继承。对于继承它的非抽象子类,要求实现抽象父类的所有抽象方法,这也是为什么抽象类中的方法不允许同时用final和abstract修饰的原因。

1.2 抽象类的应用。例:求常见平面图形(如三角形、圆、矩形和正方形等)的面积。利用抽象类,编写程序实现该功能。各种平面图形都可以求出其面积,但不同的形状求面积的方法不同,因此可以定义一个平面图形形状类Shape。Shape类有一个求面积的抽象方法(area),把它定义为抽象方法是因为不同的平面图形求法不同。圆(Circle)、矩形(Rectangle)和三角形(Triangle)都是Shape的子类,而正方形(Square)是矩形(Rectangle)中的一种特殊类型,因此是矩形的子类。

2 接口

前面讲了抽象类的应用,但在某些场合抽象类具有局限性,需要借助于接口来完成相应的功能。例如轿车、卡车、拖拉机、摩托车和客车都是机动车的子类,可以把机动车定义为一个抽象类。机动车中有“刹车”、“转向”等抽象方法,要求子类都实现“刹车”、“转向”,这是合理的。但如果机动车中还包含两个抽象方法“收取费用”和“调节温度”,所有子类都要重写“收取费用”和“调节温度”方法,这显然是不合理的。因为拖拉机不可能有这样的功能,而飞机、轮船等非机动车也具有“收取费用”和“调节温度”的行为。抽象类不适用了,这时就要应用接口来实现。

2.1 接口的声明。使用关键字interface来定义一个接口,接口定义和类的定义类似,分为接口声明和方法体部分。例如:

interface Printable{

final int max=100;

void add();

float sum(float x,float y);

}

接口中只有常量和抽象方法两部分,不允许有变量和普通方法。接口中所有常量访问权限都是public,而且是static常量(public、static、final都可以省略)。抽象方法的访问权限也是public(抽象方法中的public、abstract也可以省略)。

2.2 接口的实现。在JAVA语言中,接口是由类来实现以便使用接口中的方法。一个类需要在声明中使用implements 关键字来实现一个或多个接口。如果一个非抽象类实现了一个接口,那么它必须要实现该接口中的所有抽象方法。在实现方法时,需要去掉abstract修饰符,并用public修饰(因为类的缺省修饰符是friendly)。抽象类可以实现接口中的抽象方法也可以直接拥有接口中的方法。

2.3 接口的应用。使用接口完成对生物(Biology)、动物(Animal)、人(Man)三个接口的定义。其中生物接口定义一个breathe()方法;动物接口定义sleep()和eat()抽象方法;人接口定义think()和study()两个抽象方法。定义一个人(Person)类实现上述三个接口。

实现代码如下所示:

public interface Biology{

void breathe();

}

public interface Animal{

void sleep();

void eat();

}

public interface Man{

void think();

void study();

}

public class Person implements Biology,Animal,Man

{public void breathe(){ Sysem.out.println(“吸进的是氧气,呼出的是二氧化碳”);}

public void sleep(){System.out.println(“保持充足的睡眠”);}

public void eat(){System.out.println(“膳食搭配要合理”);}

public void think(){System.out.println(“用心思考”);}

public void study(){System.out,println(“好好学习,天天向上”);}

}

3 抽象类与接口的比较

尽管抽象类和接口有些相似的特性,但它们在本质上有很大区别:(1)抽象类在JAVA语言中体现的是一个“父与子”的关系,即抽象类与子类之间必须存在“子类是父类中一种”的关系,如抽象类“水果”与子类“苹果”之间就存在“苹果是一种水果”的关系。而接口与接口的实现者之间不必有“父与子”的关系,接口实现者只是具有接口定义的行为而已;(2)抽象类中可以定义非抽象方法,而接口中的所有方法都是抽象的;(3)接口中的数据成员只能是常量;(4)在抽象类中增加一个方法并赋予其默认的行为(即增加一个非抽象方法),并不一定要修改子类;但如果接口被修改了,即增加或去掉了某个功能,则所有实现了该接口的类一定要重新修改[2]。

参考文献:

[1]印.JAVA语言与面向对象的程序设计[M].北京:清华大学出版社,2007.

[2]张思民.JAVA语言程序设计[M].北京:清华大学出版社,2007.

作者简介:曲翠玉(1982-),女,管理科学与工程硕士,信息管理与信息系统专业讲师。

作者单位:大连理工大学 城市学院,辽宁大连 116600

上一篇:有关KMP模式匹配算法的探索 下一篇:NI Multisim 11仿真技术在模拟和数字电路教学...