1、可以实现多个interface(implements),但只能继承(extends)一个abstract类;
2、abstract类要声明方法体,但不提供实现;interface不用声明方法体,不允许提供方法的实现;
exam:
public abstract class family {
void eat() {
}
void eat(String s) {
}
}
而interface如下:
public interface family {
void eat();
void eat(String s);
}
智力测试:所有继承抽象类的类,必须实现抽象类中的各个方法,对吗?
答:不对,如果子类不是抽象类那么需要实现各个方法。
3、不能创建接口或抽象类的实例。
exam:family f = new family(); //error
4、继承abstract的子类可以部分实现基类的方法(非abstract方法),而interface必须全部实现。
exam:
public abstract class family {
abstract void eat();
abstract void eat(String s);
void run() { //这个在子类中没有实现,如果为abstract类型则必须在子类中实现
}
}
public class grandpa extends family {
public void eat(){
System.out.println("grandpa eat!");
}
@Override
void eat(String s) {
// TODO Auto-generated method stub
}
}
Java的interface和abstract class都可以定义不提供具体实现的方法。其中一个类不能继承自多个abstract class,但是可以实现多个interface。Java的类没有多重继承,所以用interface的概念来补充,通过实现多个interface来实现多重的继承。
在Java中所有的对象都用类来描绘,但是不是每一个类都用来描绘对象的。用来描绘某一类对象共有的本质,这就是抽象。比如:形状存在着圆、三角形这样一些具体概念,它们是不同的,但是它们又都属于形状这样一个概念,形状这个概念在问题领域是不存在的,它就是一个抽象概念。正是因为抽象的概念在问题领域没有对应的具体概念,所以用以表征抽象概念的抽象类(这儿的抽象类并不是abstract class翻译而来的,它包括interface和abstract class)是不能够实例化的。我们可以构造出一个固定的一组行为的抽象描述,但是这组行为却能够有任意个可能的具体实现方式。
从语言层面上面来讲:abstract class可以有自己的数据成员,也可以有非abstarct的成员方法,而在interface方式的实现中,只能够有静态的不能被修改的数据成员(也即interface是static final的),所有的成员方法都是abstract的。从这种角度来说,interface是abstarct class的一种特殊情况。abstract class可以提供某些方法的部分实现,而interface不可以,这大概就是abstract class唯一的优点吧,但这个优点非常有用。如果向一个抽象类里加入一个新的具体方法时,那么它所有的子类都一下子都得到了这个新方法,而interface做不到这一点,如果向一个interface里加入一个新方法,所有实现这个接口的类就无法成功通过编译了,因为你必须让每一个类都再实现这个方法才行。
而从设计出发:假设在我们的问题领域中有一个关于Door的抽象概念,该Door具有执行两个动作open和close,此时我们可以通过abstract class或者interface来定义一个表示该抽象概念的类型,定义方式分别如下所示:
abstract class:
代码
- abstract class Door{
- abstract void open();
- abstract void close();
- }
<script>render_code();</script>
interface:
代码
- interface Door{
- void open();
- void close();
- }
<script>render_code();</script>
其他具体的Door类型extends absract class或者implements interface就可以了。
看起来好像使用abstract class和interface没有大的区别。
但是现在如果要求Door加上报警的alarm功能,我们应该如何去设计程序的结构呢?
方案一、简单的在abstract class添加abstract void alarm()方法或者在interface中加一个alarm()方法?但是如果这样,在Door的定义中把Door概念本身固有的行为方法和另外一个概念"报警器"的行为方法混在了一起。这样引起的一个问题是那些仅仅依赖于Door这个概念的模块会因为"报警器"这个概念的改变(比如:修改alarm方法的参数)而改变。
方案二、既然open()、close()和alarm()是属于两个不同的概念,那么就应该分两个模块来设计。那,这样是应该分成两个abstract class、两个interface还是一个abstract class一个interface呢?
在java中,类是不支持多重继承的,所以,第一种方式不行,第二种方式,用两个interface来描绘:当我们明白AlarmDoor是属于alarm或者door的一种的时候,它会有一个侧重点,用两个相同的interface来描绘,很明显是不能够描绘出来问题的特点的。假设AlarmDoor是属于一个具有报警功能的Door,那么它本质上来说,是一个Door,不过是附加了alarm()的功能而已。所以对于Door的概念我们应该用一个abstract class去描绘,而alarm()的功能则用interface去描绘,代码如下:
代码
- abstract class Door{
- abstract void open();
- abstract void close();
- }
- interface Alarm{
- void alarm();
- }
- Class AlarmDoor extends Door implements Alarm{
- void open(){...}
- void close(){...}
- void alarm(){...}
- }
<script>render_code();</script>
文章借鉴了csdn的jackrong的一篇文章的例子(原文地址已经不知道了),而本身对于abstarct class和interface的理解有一部分也来自这个文章,当是我模仿加抄袭写成的文章吧。初学Java,对概念确实达不到一个高度的认识,只有通过这样的方式,希望今后可以慢慢提高……
分享到:
相关推荐
5. **9-abstract and interface** 抽象类和接口是实现多态性的工具。抽象类用于定义公共行为,而接口则提供完全抽象的方法定义。理解这两者的区别和使用场景是面向对象编程的重要一环。 6. **11-getting start ...
This document describes the structure of the Application Binary Interface (ABI) for the ARM architecture, and links to the documents that define the base standard for the ABI for the ARM Architecture...
本项目"Tugas-PBO-ABSTRACT-AND-INTERFACE"显然关注的是如何在Java中有效地利用这两种特性来设计和实现软件系统。 首先,我们来深入理解一下“抽象”。在编程中,抽象是一种将现实世界中的复杂问题简化为可管理的...
management of transmitted data and a graphical user interface (GUI) is developed for analysing the transmitted data . Various qualification tests are conducted to verify the functionality of the ...
Abstract:The pressure fluctuation in the flow passage of both impeller and casing is addressed on design condition. The initial conditions for the unsteady turbulent simulation are resulted from the...
design patterns, the factory and abstract factory. Chapter 2 , Creational Patterns, covers material and interface design, exploring the design support library and the builder design pattern.
complete abstract specification of the software-visible interface presented to the OS by the platform and firmware. Using this formal definition, a shrink-wrap OS intended to run on platforms ...
**Answer**: 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 ...
with user-friendly Graphical User Interface (GUI) and Visual DataBase Management System (VDBMS). To achieve this goal, the package is designed to have following features: A graphic editor to visually ...
You might have an abstract Document class and several concrete subclasses like TextDocument, SpreadsheetDocument, and PresentationDocument. Each document type requires a specific kind of Editor to ...
The goals are addressed by specifying a PIV data model, card edge interface, and application programming interface. Moreover, this document enumerates requirements where the international integrated ...
1. **抽象工厂接口(Abstract Factory)**:定义了创建一组相关或相互依赖对象的接口,而不指定它们的具体类。在这个例子中,可以有一个`MarketFactory`接口,它声明了创建水果和蔬菜的方法,如`createFruit()`和`...
Java提供了抽象类(abstract class)和接口(interface)来支持多态性,这是数据抽象的另一个方面。抽象类可以有方法实现,但至少有一个抽象方法,不能实例化;接口则完全由抽象方法组成,允许类实现多个接口,实现...
Specific interface specifications to develop OPC clients and/or OPC Servers (e.g., for DataAccess, Alarm&Event; Handling or Historical DataAccess) and a specification for interfaces that are common ...
Foreign Library Interfaceby Daniel AdlerDecember 13, 2011AbstractWe present an improved Foreign Function Interface (FFI) for R to call arbitary native func- tions without the need for C wrapper code. ...
The Abstract Window Toolkit (AWT) was part of the JDK from the beginning, but it really wasn't sufficient to support a complex user interface. It supported everything you could do in an HTML form and...
Part 7-2: Basic communication structure for substation and feeder equipment – Abstract communication service interface (ACSI) Part 7-3: Basic communication structure for substation and feeder ...
- **`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**: ...