参考文档:

http://www.cnblogs.com/dolphin0520/p/3811437.html

http://baike.baidu.com/link?url=Nlcx_RJXI6t7ZYHa20ShD5GAnRKHX5NtWaJdHRrfe8ZMfgeDhuEuBDb1aGB0czYhzPMwq33AOLV1GMp4CBKBVa

http://blog.sina.com.cn/s/blog_a2c2b181010153ch.html

自学java有一段时间了,但是对于java基础的一些概念还是理解不够。现整理一下 接口和抽象类的一些概念,便于记忆和理解。

百度百科中java接口的定义为:

java接口

Java接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能)。

比如人类这个接口,你可以定义走路,喝水,思考等方法,但是每个具体的人进行走路、喝水和思考时的实现方式是不同的。

如果说类对它所代表的对象的形态和行为提供了具体的运算和操作代码,接口只是对要实现接口的所有类提出了协议(protocol)。这些协议是类和接口的通讯和对话管道,以静态常量和方法签名的形式,使不同的类之间建立起一个共享体制,这就像CPU的管脚对准其接口的插脚一样。这看起来似乎对类很宽容,实际上对类提出了管理和组织机制。对类的行为,提出了政策性的宏观控制。

即接口中只规定静态常量,方法签名以及返回类型,而无具体操作代码。具体的方法行为由继承这个接口的类来实现。可以看到,一个接口有可能是只有接口名的空接口。

接口具有可继承性。如同类一样,接口中的静态常量(如果有,只能是公共静态常量)和方法可以被实现它的类所继承。所以,接口技术为在Java中实现多重继承(multiple inheritance)提供了可能性。即一个子类可以继承多个直接超类。在Java编程中,更确切地说,应该是一个子类可以继承一个直接超类和多个接口(参见图7.4)。即:

public class SubClass extends SuperClass implements Interface1, Interface2, InterfaceN {
...
}

我们称这种多重继承为间接多重继承。因为子类仅继承了接口中对方法编写的协议规范,还必须编写完善这些方法的具体代码。

如果说子类继承超类是“is a”,即“是”的关系,类和支持类之间是“has a”,即“有”的关系,或称“组合”,那么类和接口则是“like a”,即“像是”的关系。接口表示,所有实现了我这个接口的类都具有我规定的协议,即“看起来都像我”,确切地说,“看起来都像我的签名”。因为完善这个接口的类必须按照签名和返回类型编写具体代码。当然,类知道应该调用哪些方法才可实现继承过来的接口功能。

作一个比喻,继承好比“给予财富”,组合好比“你拥有我”,而接口则是“你中有我”。
接口技术有助于实现类之间的“松散关联”关系(loose coupling,也称松散耦合)。“松散关联”阐述了如下两个面向对象编程中的重要原则:
1. 尽可能地使类独立存在,“自给自足”(tied cohesion)。
2. 如果类之间有依赖关系,尽可能实现松散关联(loose coupling)。

接口以协议的形式建立了类之间的松散关系。体现了行为规范和行为实现的分离。使接口,这个特殊类的设计,上升到更抽象的高度。

接口中的变量会被隐式地指定为public static final变量(并且只能是public static final变量,用private修饰会报编译错误),而方法会被隐式地指定为public abstract方法且只能是public abstract方法(用其他关键字,比如private、protected、static、 final等修饰会报编译错误),并且接口中所有的方法不能有具体的实现,也就是说,接口中的方法必须都是抽象方法。从这里可以隐约看出接口和抽象类的区别,接口是一种极度抽象的类型,它比抽象类更加“抽象”,并且一般情况下不在接口中定义变量。

要让一个类遵循某组特地的接口需要使用implements关键字,具体格式如下:

1
2
class  ClassName  implements  Interface1,Interface2,[....]{
}

  可以看出,允许一个类遵循多个特定的接口。如果一个非抽象类遵循了某个接口,就必须实现该接口中的所有方法。对于遵循某个接口的抽象类,可以不实现该接口中的抽象方法。

接口和抽象

接口的本质是抽象,是抽象类完全抽象化的体现。所以有些文献中称接口为“纯抽象类”。如果说在抽象类中,还允许完善了的方法和实例变量存在的话,在接口中,只允许有代表协议的方法签名和其返回类型,以及静态常量。
抽象类中,以抽象方法作为接口,成为子类实现多态的协议规范。而接口将类的全部内容升华为抽象,成为子类按照指定行为规范,遵循协议约定来实现接口功能的准则。实际上,接口对抽象类提供了行为规范和行为实现分离的绝好机会,使得改写后的抽象类更加符合“自给自足”和“松散耦合”的设计原则。如一个抽象类:

public abstract someAbstractClass {
...
public abstract void someMethod();
}

分离成为一个接口和一个完善接口的类:

public interface SomeInterface {
public abstract void someMethod();
}

以及:

public class SomeClass implements someInterface {
...
public void someMethod() {...}
}

这样做的好处是:
a.使协议成为独立的接口。
b.使成为接口的协议具有更广泛的代表性和应用空间。
c.使抽象类从抽象中分离出来,使其不再包括抽象方法,因而具有创建对象的功能(注意抽象类不能够创建对象)。

3 步入接口
接口的语法格式为:

public interface InterfaceName {
public static final varType CONSTANT_NAME = value; //可选项
public abstract returnType methodName(argumentList); //可选项
}

其中:
interface——关键字。用来定义一个接口。
varType——任何基本变量类型。接口中的变量必须是静态常量。public、static和final关键字可以省略。一个接口可以没有静态常量。
returnType——返回类型。可以是任何变量类型或者对象,或void。
argumentList——包括参数类型和参数名。多个参数间用逗号分隔。接口中所有的方法必须是抽象方法。public和abstract关键字可以省略。一个接口可以没有方法声明。
所以接口的简化语法格式为:

public interface Interface Name {
varType CONSTANT_NAME value; //可选项
return Type method Name (argument List); //可选项
}

其中:
interface——关键字。用来定义一个接口。
varType——任何基本变量类型。接口中的变量必须是静态常量。public、static和final关键字可以省略。一个接口可以没有静态常量。
returnType——返回类型。可以是任何变量类型或者对象,或void。
argumentList——包括参数类型和参数名。多个参数间用逗号分隔。接口中所有的方法必须是抽象方法。public和abstract关键字可以省略。一个接口可以没有方法声明。
所以接口的简化语法格式为:

public interface Interface Name {
varType CONSTANT_NAME value; //可选项
return Type method Name (argument List); //可选项
}

以下利用这个简化格式讨论接口技术和编程。
例1:编写一个Printable接口。

public interface Printable {
void print();
}

这个接口规定凡是实现这个接口的类必须有print()方法,它的返回类型是void的。
例2:编写一个只有静态常量的接口。

public interface DepartmentCode {
int ADMINI = 1;
int FINANCE = 2;
int MARKETING = 3;
int SERVICES = 4;
}

这个接口只定义了静态常量。完善它的所有类必须遵循这些部门代码的规定。
例3:编写一个对所有图形组件规定位置协议的接口。

public interface Positionable {
short X0 = 0;
short Y0 = 0;
short getX();
short getY();
void setX(short x);
void setY(short y);
}

这个接口规定了所有图形组件的原始坐标,以及必须具有的方法协议。
例4:API的Cloneable接口。

public interface Cloneable {
}

这是Java API的空接口。它建议完善它的类应该覆盖Object.Clone()方法。

特殊变量规范。如枚举变量协议接口 Enumable。
高层次组织和控制结构规范。如 API中的 Collection 接口, List接口,等等。
具有普遍意义的周边和附属功能规范。如 Recycleable, Colorable, Positionable,等等。
本章以下小节对接口在这些方面的应用作进一步讨论。表 9.2列出了接口和抽象类在应用方面的比较。

表 2 接口和抽象类在应用方面的比较
应用
接口
抽象类
多重继承 一个类可以完善多个接口,即支持间接多重继承。 一个类只可以继承一个抽象类。
第三方开发和
扩展
可以在任何第三方已存在类的代码中实现接口。 为了继承抽象类,第三方类必须重写子类。
“like a”与“is a” 通常对边缘和附属功能提出协议性规范;具有广泛性。 通常定义对象的核心形态和行为。
同性 适用于所有实现共享签名和协议的不同应用。 适用于各种不同的实现、但都基于共同状态和行为源的应用。
自由度 只要“像我”。 必须“是我”。
可维性 相同 相同
速度 相对慢 相对快
简洁性 高。无须关键字,所有数据自动为公有静态常量。所有方法自动为抽象。 低。关键字不可省略。
可扩充性 如果在接口中添加新方法协议,必须修改所有应用它的类的代码。 如果添加完善了的新方法,无须对所有应用它的类进行修改。

5 常用API接口

在 Java API的每个包中,几乎都规定了接口,以及完善这些接口需要的技术支持和处理的异常,表 3中列出了这些 API常用接口。
表3 常用 API接口
接 口名
常量 /方法
包名
功 能
Cloneable 无。推荐覆盖Object.clone() java.lang 对象拷贝  
Comparable int compareTo(Object o) java.lang
对象排序
 
Runnable void run() java.lang
线程运行
 
接口名
常量 /方法
包名
功能
AudioClip
void loop()
void play()
void stop()
java.applet
音频播放
 
ActionListener void actionPerformed(ActionEvent) java.awt.event
事件处理
 
WindowConstants
int DISPOSE_ON_CLOSE
int DO_NOTHING_ON_CLOSE
int EXIT_ON_CLOSE
int HIDE_ON_CLOSE
javax.swing
窗口控制
 
特殊变量规范。如枚举变量协议接口 Enumable。
高层次组织和控制结构规范。如 API中的 Collection 接口, List接口,等等。
具有普遍意义的周边和附属功能规范。如 Recycleable, Colorable, Positionable,等等。
本章以下小节对接口在这些方面的应用作进一步讨论。表 9.2列出了接口和抽象类在应用方面的比较。

表 2 接口和抽象类在应用方面的比较
应用
接口
抽象类
多重继承 一个类可以完善多个接口,即支持间接多重继承。 一个类只可以继承一个抽象类。
第三方开发和
扩展
可以在任何第三方已存在类的代码中实现接口。 为了继承抽象类,第三方类必须重写子类。
“like a”与“is a” 通常对边缘和附属功能提出协议性规范;具有广泛性。 通常定义对象的核心形态和行为。
同性 适用于所有实现共享签名和协议的不同应用。 适用于各种不同的实现、但都基于共同状态和行为源的应用。
自由度 只要“像我”。 必须“是我”。
可维性 相同 相同
速度 相对慢 相对快
简洁性 高。无须关键字,所有数据自动为公有静态常量。所有方法自动为抽象。 低。关键字不可省略。
可扩充性 如果在接口中添加新方法协议,必须修改所有应用它的类的代码。 如果添加完善了的新方法,无须对所有应用它的类进行修改。

5 常用API接口

在 Java API的每个包中,几乎都规定了接口,以及完善这些接口需要的技术支持和处理的异常,表 3中列出了这些 API常用接口。
表3 常用 API接口
接 口名
常量 /方法
包名
功 能
Cloneable 无。推荐覆盖Object.clone() java.lang 对象拷贝  
Comparable int compareTo(Object o) java.lang
对象排序
 
Runnable void run() java.lang
线程运行
 
接口名
常量 /方法
包名
功能
AudioClip
void loop()
void play()
void stop()
java.applet
音频播放
 
ActionListener void actionPerformed(ActionEvent) java.awt.event
事件处理
 
WindowConstants
int DISPOSE_ON_CLOSE
int DO_NOTHING_ON_CLOSE
int EXIT_ON_CLOSE
int HIDE_ON_CLOSE
javax.swing
窗口控制
 

理解java接口和抽象类相关推荐

  1. java接口深入理解,深入理解Java接口

    从java接口是什么到为什么,理解java接口,主要解决三个问题 1.java接口是什么 2.java接口为什么 3.java接口怎么用 java接口是什么 接口是方法的抽象,通过接口规定类需要实现那 ...

  2. 什么时候使用接口?什么时候使用抽象?选择Java接口还是抽象类 (转)

    老帖了,但是还是想自己收录一下.最后也把自己对于这个问题的一些粗糙的理解记录下来. 在一个面向对象的系统中,系统的各种功能是由许许多多的不同对象协作完成的.在这种情况下,各个对象内部是如何实现自己的对 ...

  3. java接口和抽象类的区别(经典面试题)

    java接口和抽象类的区别(经典面试题) 要了解接口和抽象类的区别,首先需要明白接口和抽象类的定义. 1.抽象类 包含抽象方法的类称为抽象类,但并不意味着抽象类中只能有抽象方法,它和普通类一样,同样可 ...

  4. java接口和抽象类的区别和作用

    java接口和抽象类的区别和作用 接口(英文:Interface),在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明.一个类通过(implements)接口的方 ...

  5. java 接口是抽象类吗_我是如何理解Java抽象类和接口的

    在面试中我们经常被问到:Java中抽象类和接口的区别是什么?然后,我们就大说一通抽象类可以有方法,接口不能有实际的方法啦;一个类只能继承一个抽象类,却可以继承多个接口啦,balabala一大堆,就好像 ...

  6. 深入理解Java中的抽象类和接口

    对于面向对象编程来说,抽象是它的一大特征之一.在Java中,可以通过两种形式来体现OOP的抽象:接口和抽象类.这两者有太多相似的地方,又有太多不同的地方.很多人在初学的时候会以为它们可以随意互换使用, ...

  7. 选择Java接口还是抽象类

    很多人有过这样的疑问:为什么有的地方必须使用接口而不是抽象类,而在另一些地方,又必须使用抽象类而不是接口呢?或者说,在考虑Java类的一般化问题时,很多人会在接口和抽象类之间犹豫不决,甚至随便选择一种 ...

  8. 抽象类中不能有private的成员_【java基础】-- java接口和抽象类的异同分析

    在java中,通常初学者搞不懂接口与抽象类,这也是面试比较容易问到的一个问题.下面我来谈谈自己的理解.如有不妥之处,还望批评指正,不胜感激. 1.抽象类怎么定义和继承? 2.接口怎么定义和实现? 3. ...

  9. java接口与抽象类异同分析

    在java中,通常初学者搞不懂接口与抽象类,这也是面试比较容易问到的一个问题.下面我来谈谈自己的理解.如有不妥之处,还望批评指正,不胜感激. 1.抽象类 我们定义一个抽象类person.class表示 ...

最新文章

  1. 基于bmob的校园资料分享互助平台
  2. 利用大数据技术探索“数字公民”创新
  3. 跨链(5)“蚂蚁区块链”之跨链系统框架
  4. 在jsp中应如何避免,request.getContextPath();等get报错问题
  5. What is WCF
  6. Object的构造函数方法
  7. 学习使用ADO.NET Data Services (ADO.NET 数据服务框架) - Part 1
  8. Java设计模式(四)——再谈观察者模式
  9. 《运算放大器权威指南(Op Amps for Everyone)》读书笔记(一)
  10. uniapp-页面内/页面间数据的流动传递-this-that
  11. 计算机休眠和睡眠省电,几步教会你笔记本睡眠和休眠有什么区别
  12. Excel 复制粘贴筛选出来的数据行
  13. 9宫格 java_java实现9宫格及九宫格求解的程序.docx
  14. ios swift是静态语言吗
  15. 前程无忧:2021节后招聘高峰是否回来
  16. 嵌入式单片机基础篇(十三)之 STM32 内部温度传感器
  17. 在警察领域高级人脸识别技术的一致性
  18. phantompdf 下载_英雄联盟手游详细下载方法,附中文翻译!
  19. Loadrunner分析
  20. 3D动态烟花--HTML

热门文章

  1. 四、Node.js - 数据库与身份认证
  2. 第3章 判断语句进阶
  3. C语言整数转字符串-递归算法
  4. ubuntu系统(二):ibus拼音将繁体中文改为简体中文
  5. 何为五笔输入的最高境界?
  6. 《富爸爸,穷爸爸》思维导图
  7. Git push 常见用法
  8. 冠状病毒的治疗方案汇总
  9. web前端培训靠谱吗,收费怎么样?
  10. 传统安防监控摄像头Onvif云台控制直播流如何转换成GB/T28181对接到国标视频平台公安内网