Java编程那些事儿68——抽象类和接口(一)
陈跃峰
出自:http://blog.csdn.net/mailbomb
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
8.9 抽象类和接口
在实际的项目中,整个项目的代码一般可以分为结构代码和逻辑的代码。就像建造房屋时,需要首先搭建整个房屋的结构,然后再细化房屋相关的其它的结构,也像制造汽车时,需要首先制作汽车的框架,然后才是安装配件以及美化等工作。程序项目的实现也遵循同样的道理。
在项目设计时,一个基本的原则就是——“设计和实现相分离”。也就是说结构代码和逻辑代码的分离,就像设计汽车时只需要关注汽车的相关参数,而不必过于关心如何实现这些要求的制作。程序设计时也是首先设计项目的结构,而不用过多的关系每个逻辑的代码如何进行实现。
前面介绍的流程控制知识,主要解决的是逻辑的代码的编写,而类和对象的知识,则主要解决结构代码的编写。那么还有一个主要的问题:如何设计结构代码呢?这就需要使用下面介绍的抽象类和接口的知识了。
8.9.1 抽象类
抽象类(Abstract Class)是指使用abstract关键字修饰的类,也就是在声明一个类时加入了abstract关键字。抽象类是一种特殊的类,其它未使用abstract关键字修饰的类一般称作实体类。例如:
public abstract class A{
public A(){}
}
抽象方法(Abstract Method)是指使用abstract关键字修饰的方法。抽象方法是一种特殊的方法,其它未使用abstract关键字修饰的方法一般称作实体方法。
public abstract void test();
抽象类和实体类相比,主要有以下两点不同:
l 抽象类不能使用自身的构造方法创建对象(语法不允许)
例如下面的语法是错误的:
A a = new A();
但是抽象类可以声明对象,例如下面的代码是正确的:
A a;
A a1,a2;
只是声明出的对象默认都是null的,无法调用其内部的非静态属性和非静态方法。
说明:抽象类可以使用子类的构造方法创建对象。
l 抽象类内部可以包含任意个(0个、1个或多个)抽象方法
抽象类内部可以包含抽象方法,也可以不包含抽象方法,对于包含的个数没有限制。而实体类内部不能包含抽象方法。
在抽象类内部,可以和实体类一样,包含构造方法、属性和实体方法,这点和一般的类一样。
抽象方法和实体方法相比,主要有以下几点不同:
l 抽象方法没有方法体
也就是说在声明抽象方法时,不能书写方法体的{},而只能以分号结束方法。下面是实体方法和抽象方法声明的比较:
抽象方法声明:
public abstract void test(int a);
实体方法声明:
public void test(int a){
方法体
}
l 抽象方法所在的类必须为抽象类
也就是说,如果抽象方法声明在一个类内部,则该类必须为抽象类。(说明:抽象方法也可以出现在接口内部,这个将在后续进行介绍)。
这样,在继承时,如果继承的类是抽象类,而该抽象类中还包含抽象方法时,则该子类必须声明成抽象类,否则将出现语法错误。如果子类需要做成实体类的话,则必须覆盖继承的所有抽象方法。这个是抽象类最核心的语法功能——强制子类覆盖某些方法。
介绍了这么多抽象类和抽象方法的知识以后,那么抽象类有什么用途呢?
抽象类的用途主要有两个:
l 严禁直接创建该类的对象
如果一个类内部包含的所有方法都是static方法,那么为了避免其它程序员误用,则可以将该类声明为abstract,这样其它程序员只能使用类名.方法名调用对应方法,而不能使用对象名.方法名进行调用。这样的类例如API中的Math类
说明:配合final关键字使用,将必须该类被继承,这样将获得更加完美的效果。
l 强制子类覆盖抽象方法
这样可以使所有的子类在方法声明上保持一致,在逻辑上也必须将方法的功能保持一致。例如游戏中设计类时,设计了怪物类以及相关的子类,每个怪物类都有移动方法,但是每种怪物的移动规则又不相同,这样通过使每个怪物类的移动方法的声明保持一致,方便调用。可以参看前面多态部分的介绍获得更多的关于调用统一知识。
这是抽象类最主要的用途。就像现实社会中,各种银行网点保持统一的装修风格,各种快餐店(肯德基、麦当劳等)保持统一的装修甚至风味,这样便于生活中的识别。通过让存在继承关系的类中功能一样(但是内部实现规则不同)的方法声明成一样的,方便多态的使用。
那么什么时候在设计时使用抽象类呢?这个问题参看一下抽象类的用途自然就知道了。关于抽象类的知识先介绍这么多,下面介绍接口的知识,最终将对抽象类和接口进行一下比较。
分享到:
相关推荐
理解类与对象的关系,掌握抽象类和接口的使用,是进阶Java开发者的必备技能。 异常处理是Java程序健壮性的关键。Java通过try-catch-finally语句块来捕获并处理运行时错误,保证了程序的正常执行。理解异常分类,如...
在Java编程语言中,抽象类和接口是两种重要的面向对象设计概念,它们允许我们定义规范,供其他类去实现或继承。在这个练习中,我们将深入理解这两种机制,并通过实际的代码示例和注释来加深理解。 首先,让我们讨论...
### 详细解析Java中抽象类和接口的区别 #### 引言 在面向对象编程中,Java作为一种广泛应用的编程语言,提供了多种方式来实现抽象的概念。其中最常用的两种机制是抽象类(abstract class)和接口(interface)。这...
在Java编程语言中,抽象类和接口是两种重要的面向对象设计概念,它们允许我们定义规范,为其他类提供模板或行为指南。让我们深入探讨这两个概念及其在Java中的应用。 首先,我们来理解抽象类。在Java中,抽象类是一...
Java中的类、抽象类和接口的区别和联系
java抽象类与接口实例java抽象类与接口实例java抽象类与接口实例java抽象类与接口实例java抽象类与接口实例java抽象类与接口实例java抽象类与接口实例java抽象类与接口实例java抽象类与接口实例java抽象类与接口实例...
在Java语言中,abstract class和interface 是支持抽象类定义的两种机制。正是由于这两种机制的存在,才赋予了Java强大的面向对象能力。abstract class和interface之间在对于抽象类定义的支持方面具有很大的相似性,...
Java抽象类与接口实验报告
此书对于你学习Java抽象类和接口有非常大的帮助
Java中的抽象类(abstract class)和接口(interface)都是用于创建抽象化模型的重要工具,它们在面向对象编程中扮演着核心角色。这两种机制都允许我们定义一组方法的签名,但不提供具体实现,从而实现“设计契约”...
在Java编程语言中,接口(Interface)和抽象类(Abstract Class)都是用于实现多态性的关键概念,它们各自有特定的用途和优缺点。本文将深入探讨这两种概念,帮助你理解它们之间的区别以及如何在实际开发中选择使用...
在上面的练习中,我们使用抽象类和接口来实现多态性。在 LivingThing 抽象类中,我们定义了一个抽象方法 dance(String dancingStyle),然后在 Human 和 Monkey 中实现了该方法。在 PersonInterface 接口中,我们定义...
在Java编程语言中,抽象类和接口是两种重要的面向对象设计概念,它们都用于实现多态性,但各自具有不同的特点和应用场景。了解并熟练掌握它们的区别对于编写高质量的Java代码至关重要。 首先,抽象类是一种不能被...
在Java编程语言中,接口(Interface)和抽象类(Abstract Class)都是用于实现多态性和代码复用的重要概念。它们都无法被直接实例化,而是位于继承结构的顶层,被其他类实现或继承。接口和抽象类都可以包含抽象方法...
在Java编程中,抽象类(Abstract Class)与接口(Interface)都是实现抽象的关键工具。它们各自有着独特的优势和适用场景,掌握这两者的区别有助于开发者更好地设计系统架构。本文将深入探讨Java抽象类与接口的区别...
这意味着抽象类和接口提供了不同的多态性形式。 - 当需要一组类共享相同的接口,但实现方式各不相同时,使用接口更合适。如果希望为类提供部分实现,并强制子类完成剩余部分,那么抽象类更有用。 6. **示例** 在 ...
在 Java 编程语言中,抽象类和接口是两种基本的编程概念,它们都是定义类的蓝图,但它们之间有着本质的区别。 一、抽象类 抽象类是一种特殊的类,它不能被实例化,必须被继承。抽象类提供了一种定义类的模板,它...
"Java抽象类和接口和继承之间关系" Java抽象类和接口是两种不同的概念,它们之间存在着继承关系。在Java中,抽象类(abstract class)和接口(interface)都是用来描述对象的行为和状态的,但它们之间有着明显的...
Java提供了三种方式来扩展类的功能:基本类、抽象类和接口。这三者之间既有相似之处,也有明显的区别。本文将详细介绍Java中的基本类、抽象类以及接口的概念,并分析它们之间的区别和联系。 #### 二、基本类 **...