转自:http://blog.csdn.net/liujun13579/article/details/7736116/

一、定义

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

接口定义的一般形式为:

[访问控制符]interface <接口名> {

类型标识符final 符号常量名n = 常数;

返回值类型  方法名([参数列表]);

}

二、接口的特点

1、Java接口中的成员变量默认都是public,static,final类型的(都可省略),必须被显示初始化,即接口中的成员变量为常量(大写,单词之间用"_"分隔)

2、Java接口中的方法默认都是public,abstract类型的(都可省略),没有方法体,不能被实例化

3、Java接口中只能包含public,static,final类型的成员变量和public,abstract类型的成员方法

4、接口中没有构造方法,不能被实例化

5、一个接口不能实现(implements)另一个接口,但它可以继承多个其它的接口

6、Java接口必须通过类来实现它的抽象方法

7、当类实现了某个Java接口时,它必须实现接口中的所有抽象方法,否则这个类必须声明为抽象类

8、不允许创建接口的实例(实例化),但允许定义接口类型的引用变量,该引用变量引用实现了这个接口的类的实例

9、一个类只能继承一个直接的父类,但可以实现多个接口,间接的实现了多继承.

三、接口的用法

1、精简程序结构,免除重复定义

比如,有两个及上的的类拥有相同的方法,但是实现功能不一样,就可以定义一个接口,将这个方法提炼出来,在需要使用该方法的类中去实现,就免除了多个类定义系统方法的麻烦。

举例:鸟类和昆虫类都具有飞行的功能,这个功能是相同的,但是其它功能是不同的,在程序实现的过程中,就可以定义一个接口,专门描述飞行。

下图是分别定义鸟类和昆虫类,其都有飞行的方法。

下图定义了接口,其类图如下:

实现代码如下:

  1. interface   Flyanimal{
  2. void fly();
  3. }
  4. class   Insect {
  5. int  legnum=6;
  6. }
  7. class  Bird {
  8. int  legnum=2;
  9. void egg(){};
  10. }
  11. class Ant extendsInsect implements  Flyanimal {
  12. public void fly(){
  13. System.out.println("Ant can  fly");
  14. }
  15. }
  16. classPigeon  extends Bird implements  Flyanimal {
  17. public void fly(){
  18. System.out.println("pigeon  can fly");
  19. }
  20. public void egg(){
  21. System.out.println("pigeon  can lay  eggs ");
  22. }
  23. }
  24. public classInterfaceDemo{
  25. public static void main(String args[]){
  26. Ant a=new Ant();
  27. a.fly();
  28. System.out.println("Ant's legs are"+ a.legnum);
  29. Pigeon p= new Pigeon();
  30. p.fly();
  31. p.egg();
  32. }
  33. }

程序运行结果:

Ant can  fly

Ant'slegs  are 6

pigeon  can fly

pigeon  can lay  eggs

二、拓展程序功能,应对需求变化。

假设一个学校接待方面的程序,招待不同身份的人的食宿问题,其对应规则如下:

身份

宿

学生

食堂

宿舍

教师

教师食堂

学校公寓

学生家长

招待所

招待所

理论上,当然可以对每个不同身份的人各定义一个对应的类,并实现各自的方法,但是观察这写类,可以归纳出其有一个共同的模板,即“人”的“食、宿”问题。这时候,就可以发挥接口的功能了。实现代码如下:

  1. interfacePerson{
  2. void eat();
  3. void sleep();
  4. }
  5. class Studentimplements Person{
  6. public void eat(){
  7. System.out.println("学生去食堂吃饭!");
  8. }
  9. public void sleep(){
  10. System.out.println("学生回寝室睡觉!");
  11. }
  12. }
  13. class Teacherimplements Person{
  14. public void eat(){
  15. System.out.println("教师去教工餐厅吃饭!");
  16. }
  17. public void sleep(){
  18. System.out.println("教师回学校公寓睡觉!");
  19. }
  20. }
  21. class Parents implements Person{
  22. publicvoid eat(){
  23. System.out.println("家长去招待所饭馆吃饭!");
  24. }
  25. public void sleep(){
  26. System.out.println("家长回招待所睡觉!");
  27. }
  28. }
  29. public class PersonInterface{
  30. public static void main(String[] args)
  31. {
  32. Person p=new Student();
  33. p.eat();
  34. p.sleep();
  35. p=new Teacher();
  36. p.eat();
  37. p.sleep();
  38. p=new Parents();
  39. p.eat();
  40. p.sleep();
  41. }
  42. }

程序执行结果:

学生去食堂吃饭!

学生回寝室睡觉!

教师去教工餐厅吃饭!

教师回学校公寓睡觉!

家长去招待所饭馆吃饭!

家长回招待所睡觉!

现在需要添加一些功能,即现在需要添加“外宾、上级领导”两类角色,并且以后工具需要还要添加相应的身份角色的人进来,此时,只需要根据需要添加“外宾”类、“领导”类,而主类仍然可以拿来就用,无需进行更多的修改。此时就可以显示出接口的作用了。

在上面的程序中添加如下两个类即可。

  1. class Foreign implements Person{
  2. publicvoid eat(){
  3. System.out.println("外宾去酒店吃饭!");
  4. }
  5. public void sleep(){
  6. System.out.println("外宾回酒店睡觉!");
  7. }
  8. }
  9. class Leader implements Person{
  10. publicvoid eat(){
  11. System.out.println("领导去宾馆吃饭!");
  12. }
  13. public void sleep(){
  14. System.out.println("外宾回宾馆睡觉!");
  15. }
  16. }

而主函数中用法仍然一样。

下面给出完整的代码:

  1. interfacePerson{
  2. void eat();
  3. void sleep();
  4. }
  5. class Studentimplements Person{
  6. public void eat(){
  7. System.out.println("学生去食堂吃饭!");
  8. }
  9. public void sleep(){
  10. System.out.println("学生回寝室睡觉!");
  11. }
  12. }
  13. class Teacherimplements Person{
  14. public void eat(){
  15. System.out.println("教师去教工餐厅吃饭!");
  16. }
  17. public void sleep(){
  18. System.out.println("教师回学校公寓睡觉!");
  19. }
  20. }
  21. class Parents implements Person{
  22. publicvoid eat(){
  23. System.out.println("家长去招待所饭馆吃饭!");
  24. }
  25. public void sleep(){
  26. System.out.println("家长回招待所睡觉!");
  27. }
  28. }
  29. class Foreign implements Person{
  30. publicvoid eat(){
  31. System.out.println("外宾去酒店吃饭!");
  32. }
  33. public void sleep(){
  34. System.out.println("外宾回酒店睡觉!");
  35. }
  36. }
  37. class Leader implements Person{
  38. publicvoid eat(){
  39. System.out.println("领导去宾馆吃饭!");
  40. }
  41. public void sleep(){
  42. System.out.println("领导回宾馆睡觉!");
  43. }
  44. }
  45. public class PersonInterface{
  46. public static void main(String[] args)
  47. {
  48. Person p=new Student();
  49. p.eat();
  50. p.sleep();
  51. p=new Teacher();
  52. p.eat();
  53. p.sleep();
  54. p=new Parents();
  55. p.eat();
  56. p.sleep();
  57. p=new Foreign();
  58. p.eat();
  59. p.sleep();
  60. p=new Leader();
  61. p.eat();
  62. p.sleep();
  63. }
  64. }

程序执行结果:

学生去食堂吃饭!

学生回寝室睡觉!

教师去教工餐厅吃饭!

教师回学校公寓睡觉!

家长去招待所饭馆吃饭!

家长回招待所睡觉!

外宾去酒店吃饭!

外宾回酒店睡觉!

领导去宾馆吃饭!

领导回宾馆睡觉!

举例二:

用来计算每一种交通工具运行1000公里所需的时间,已知每种交通工具的参数都是3个整数A、B、C的表达式。现有两种工具:

Car 和Plane,其中Car 的速度运算公式为:A*B/C

Plane 的速度运算公式为:A+B+C。

如果增加第3种交通工具的时候,比如火车(Train)不必修改以前的任何程序,只需要编写新的交通工具的程序。

  1. import java.lang.*;
  2. interface Common {
  3. double runTimer(doublea, double b, double c);
  4. String getName(); //获取交通工具的名称
  5. }
  6. class Plane implementsCommon  {
  7. public doublerunTimer(double a, double b, double c)  {
  8. return (a+ b + c);
  9. }
  10. public String getName(){
  11. return"Plane";
  12. }
  13. }
  14. class Car implements Common {
  15. public doublerunTimer(double a, double b, double c) {
  16. return ( a*b/c );
  17. }
  18. public String getName(){
  19. return"Car";
  20. }
  21. }
  22. public class ComputeTime {
  23. public static void main(Stringargs[])  {
  24. double A=3;
  25. double B=5;
  26. double C=6;
  27. double v,t;
  28. Commond=new Car();
  29. v=d.runTimer(A,B,C);
  30. t=1000/v;
  31. System.out.println(d.getName()+"的平均速度: "+v+" km/h");
  32. System.out.println(d.getName()+"的运行时间:"+t+" 小时");
  33. d=newPlane();
  34. v=d.runTimer(10,30,40);
  35. t=1000/v;
  36. System.out.println(d.getName()+"的平均速度: "+v+" km/h");
  37. System.out.println(d.getName()+"的运行时间:"+t+" 小时");
  38. }
  39. }

程序运行结果;

Car的平均速度: 2.5 km/h

Car的运行时间:400.0 小时

Plane的平均速度: 80.0 km/h

Plane的运行时间:12.5 小时

最新文章

  1. [leetcode] 29. divide two integers
  2. Emacs使用projectile-rails 插件注意事项
  3. DPM检测模型 VoC-release 5 linux 下编译运行
  4. 开发基础框架:mybatis-3.2.8 +hibernate4.0+spring3.0+struts2.3
  5. 【MediaKit】WPF项目中 调用摄像头拍照的开发包
  6. 谈数据库索引和Sqlite中索引的使用
  7. Codeforces Round #382 (Div. 2)E. Ostap and Tree
  8. Bluetooth 4.0之Android 解说
  9. Linux调试工具strace和gdb常用命令小结
  10. SQL AlawaysOn 之一:安装域控制器
  11. webpack使用总结
  12. 认识Java中的字符串
  13. Spring中Bean的生命周期讨论
  14. 3.JAVA基础复习——JAVA中的类与对象
  15. django之视图获取用户请求相关信息以及请求头
  16. shell 文件操作
  17. Asp.net Mvc身份验证
  18. 安装最新版的2016版Pycharm后,激活码
  19. kubernets实战采坑1
  20. 【论文笔记】如何理解深度学习中的End to End

热门文章

  1. php绘图问题
  2. win系统登录密码重置
  3. Codeforces
  4. ES5 对数组方法的扩展 以及 正则表达式
  5. C++注意事项
  6. 救援linux
  7. 手动刷新magento的索引管理方法
  8. linux查看一条命令的执行结果是1还是0
  9. About SCCM 2012 UDA(User Device Affinity)
  10. SQL---Chapter01 数据库和SQL