java编程思想中说“万物皆对象”; 我们知道所有的对象都是通过类来描绘的,但是反过来却不是这样。并不是所有的类都是用来描绘对象的.
如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。
抽象类是我们对问题领域进行分析、设计中得出的抽象概念,是对一系列看上去不同,但是本质上相同的具体概念的抽象。
比如:如果我们进行一个图形编辑软件的开发,就会发现问题领域存在着圆、 三角形这样一些具体概念,它们是不同的,但是它们又都属于形状这样一个概念,形状这个概念在问题领域是不存在的,它就是一个抽象概念。正是因为抽象的概念 在问题领域没有对应的具体概念,所以用以表征抽象概念的抽象类是不能够实例化的。
在面向对象领域,抽象类主要用来进行类型隐藏。
[类型隐藏: 我们可以构造出一个固定的一组行为的抽象描述,但是这组行为却能够有任意个可能的具体实现方式。这个抽象描述就是抽象类,而这一组任意个可能的具体实现则表现为所有可能的派生类。]
如:动物是一个抽象类,人、猴子、老虎就是具体实现的派生类,我们就可以用动物类型来隐藏人、猴子和老虎的类型。
接口:一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能)。接口是一种特殊形式的抽象类。
区别:
1.抽象类在Java语言中表示的是一种继承关系,要想使得继承关系合理,父类和派生类之间必须存在”is a”关系,即父类和派生类在概念本质上应该是相同的。对于接口来说则不然,并不要求接口的实现者和接口定义在概念本质上是一致的,仅仅是实现了接口定义的契约而已。接口表示的是”like a”关系。 一个类只能使用一次继承关系。但是,一个类却可以实现多个接口
2.抽象类的定义中,我们可以赋予方法的默认行为。但是在接口的定义中,方法却不能拥有默认行为,
3.使用抽象类来定义允许多个实现的类型,比使用接口有一个明显的优势:抽象类的演化比接口的演化要容易的多。在后续的发行版中,如果希望在抽象类中增加一个方法,只增加一个默认的合理的实现即可,抽象类的所有实现都自动提供了这个新的方法。对于接口,这是行不通的。虽然可以在骨架实现类中增加一方法的实现来解决部分问题,但这不能解决不从骨架实现类继承的接口实现的问题。由此,设计公有的接口要非常谨慎,一旦一个接口被公开且被广泛实现,对它进行修改将是不可能的。
======================================================================
类描述了一个实体,包括实体的状态,也包括实体可能发出的动作。
接口定义了一个实体可能发出的动作。但是只是定义了这些动作的原型,没有实现,也没有任何状态信息。 所以接口有点象一个规范、一个协议,是一个抽象的概念;而类则是实现了这个协议,满足了这个规范的具体实体,是一个具体的概念。
从程序角度,简单理解,接口就是函数声明,类就是函数实现。需要注意的是同一个声明可能有很多种实现。
1、接口中定义类方法的原型,但是不能说是空方法,因为空方法的意思是有实现体,只不过实现体是空操作。实际上接口没有定义任何实现体。具体的实现体都是在实现接口的类中,接口只是定义了这些方法的调用方式。
你当然也可以不用接口,直接在类里面写方法,但是如果你的一组方法需要在很多类里实现,那么把它们抽象出来,做成一个接口规范,不是更好么?
2、一个类描述了一个实体,这个实体可能是一个复杂的对象,它的动作很多,如果把这些动作分类,用接口a定义其中的某一组动作,接口b定义其中的另外一组动作,这样的结构,比较清楚。
这种方式具备了多继承的优点,避免了多继承的缺陷。实际上在历史上,接口在很大程度上,是为了解决多继承带来的种种问题而设计出来的。
抽象类不能被实例化,也就是说,不能创建抽象类的任何对象。必须创建抽象类的子类,然后再创建子类的对象。一个接口可以继承多个接口,一个类可以实现多个接口。
分享到:
相关推荐
Chapter 12: Interfaces and Abstract Classes in Java Chapter 13: Packages Chapter 14: Debugging Chapter 15: Enums Chapter 16: Generic Types Chapter 17: Threading Chapter 18: Graphical User Interface) ...
- **`GenericServlet` Wrapper Class**: This abstract class provides a convenient implementation of the `Servlet` interface and can be extended to create custom servlets. - **Thread-Safe Servlets**: ...
Java提供了抽象类(abstract class)和接口(interface)来支持多态性,这是数据抽象的另一个方面。抽象类可以有方法实现,但至少有一个抽象方法,不能实例化;接口则完全由抽象方法组成,允许类实现多个接口,实现...
The interface has an abstract method called play(). Create classes called Child, Musician and Actor that implement Playing. Create a program that demonstrates the use of the classes. Playing.java ...
在Java中,这种模式常用于当系统需要根据不同的平台或环境创建不同类型的对象时,例如这里的“北方市场”和“南方市场”。通过抽象工厂模式,我们可以隔离具体产品的实现细节,并允许添加新的产品类型而无需修改现有...
JNDI(Java Naming and Directory Interface)则用于访问命名和目录服务,比如查找和管理网络资源。 JMS(Java Message Service)是Java消息服务,用于在分布式环境中传递消息,实现异步通信。 JTS(Java ...
在"Java2_类库"中,"JNDI"(Java Naming and Directory Interface)提供了一种查找和管理资源的方式,如对象、服务、数据源等,常用于企业级应用。 最后,"Java2_类库"还包含了许多其他的模块,如XML处理(DOM、SAX...
Chapter 12: Interfaces and Abstract Classes in Java Chapter 13: Packages Chapter 14: Debugging Chapter 15: Enums Chapter 16: Generic Types Chapter 17: Threading Chapter 18: Graphical User Interface) ...
Java 方法、类层次结构与接口 在编程领域,特别是Java语言中,理解类层次结构(Class Hierarchies)和接口(Interfaces)对于实现面向对象编程(Object-Oriented Programming, OOP)至关重要。本讲义将详细介绍这些...
Java图形用户界面(GUI,Graphical User Interface)是Java编程中的一个重要部分,它允许开发者创建交互式的桌面应用程序。"Java GUI万能模板"通常是指一套通用的、可复用的代码结构,帮助开发者快速构建GUI应用,...
In Java, an abstract class can have both abstract and non-abstract (concrete) methods, whereas an interface can only have abstract methods (since Java 8, interfaces can also have default and static ...
Java图形用户界面(GUI,Graphical User Interface)是Java编程中的一个重要组成部分,它允许开发者创建交互式的、视觉吸引人的应用程序。在Java中,我们可以利用Java Swing库或JavaFX库来构建GUI。本压缩包“Java-...
Java应用程序设计接口(API,Application Programming Interface)是Java编程语言的核心组成部分,它为开发者提供了预定义的类库、方法和接口,使得开发人员能够构建高效、可移植的Java应用程序。在下册“窗口”部分...
JavaGUI(Graphical User Interface)可视化插件是用于构建Java应用程序的工具,它允许开发者通过拖放组件的方式创建用户界面,极大地简化了UI设计过程。JavaGUI的核心是Swing和JavaFX两个库,它们提供了丰富的组件...