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. }
  7. class  Bird {
  8. int  legnum=;
  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=;
  25. double B=;
  26. double C=;
  27. double v,t;
  28. Commond=new Car();
  29. v=d.runTimer(A,B,C);
  30. t=/v;
  31. System.out.println(d.getName()+"的平均速度: "+v+" km/h");
  32. System.out.println(d.getName()+"的运行时间:"+t+" 小时");
  33. d=newPlane();
  34. v=d.runTimer(,,);
  35. t=/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 小时

转:十九、Java的接口及实例的更多相关文章

  1. “全栈2019”Java第八十九章:接口中能定义内部类吗?

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  2. Java进阶(三十九)Java集合类的排序,查找,替换操作

    Java进阶(三十九)Java集合类的排序,查找,替换操作 前言 在Java方向校招过程中,经常会遇到将输入转换为数组的情况,而我们通常使用ArrayList来表示动态数组.获取到ArrayList对 ...

  3. 转载:Java的接口及实例

    转自:http://blog.csdn.net/liujun13579/article/details/7736116/ 一.定义 Java接口(Interface),是一系列方法的声明,是一些方法特 ...

  4. Java的接口及实例

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

  5. Java学习笔记十九:Java中的访问控制修饰符

    Java中的访问控制修饰符 一:Java修饰符的种类: 访问修饰符 非访问修饰符 修饰符用来定义类.方法或者变量,通常放在语句的最前端.我们通过下面的例子来说明: public class Hello ...

  6. 菜鸡的Java笔记 第十九 - java 继承

    继承性的主要目的,继承的实现,继承的限制                继承是面向对象中的第二大主要特点,其核心的本质在于:可以将父类的功能一直沿用下去                为什么需要继承? ...

  7. 一起talk C栗子吧(第一百一十九回:C语言实例--线程死锁三)

    各位看官们.大家好,上一回中咱们说的是线程死锁的样例,这一回咱们继续说该样例.闲话休提,言归正转.让我们一起talk C栗子吧! 看官们,由于篇幅的原因我们在上一回仅仅介绍了死锁发生的第一种原因,今天 ...

  8. 菜鸡的Java笔记 第二十九 - java 单例设计模式

    SingleCase 单例设计模式        1.单例设计模式的特点        2.多例设计模式的特点    内容    单例设计模式        现在如果说有这么一个程序类 class S ...

  9. “全栈2019”Java第七十九章:类中可以嵌套接口吗?

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

随机推荐

  1. Windows Server 2008 计划任务配置(任务计划程序)每分钟执行BAT

    首先Windows Server 2008不同于其他服务器操作系统和Windows Server 2003有着很大的区别,计划任务的名称是“任务计划程序”不在控制面板里,而是在“管理工具”里. 由于服 ...

  2. iOS 查找字符串 相同 子字符串的位置 range

    问题:解决替换同一个字符串的多个相同的字符eg. xxx这个超级大土豪白送xxx一个!赶快来抢把! 将第一个xxx换成名字 将第二个xxx换成物品 两种办法    第二种办法更灵活一点 //第一种办法 ...

  3. Fxcop 初体验

    代码质量对于软件项目的成败很重要,这点我想大家都明白.那么在一个软件团队中如何保证代码质量呢?对于这个问题不同的人可能会有不同的答案,对于我而言我觉得做好两点代码质量基本就可以保证了: 1.代码规范( ...

  4. ios专题 - 图片(UIImage)获取方法

    说到图片获取的方法,就得看API文档. UIImage生成实例的方法有: 1)imageNamed 从指定文件返回对象. 这个方法有个比较特殊的地方:该方法首先从系统缓存中寻找该图片,如果有,则从缓存 ...

  5. MinGW-notepad++开发c/c++程序

    下载MinGW 点击下载 安装好后运行 最后点击左上角的 Installation,开始安装 1.编译: g++ -o a.exe a.cpp gcc -o hello.exe hello.c 2.运 ...

  6. bzoj1688: [Usaco2005 Open]Disease Manangement 疾病管理

    思路:状压dp,枚举疾病的集合,然后判断一下可行性即可. #include<bits/stdc++.h> using namespace std; #define maxs 400000 ...

  7. (poj)3414 Pots (输出路径的广搜)

    Description You are given two pots, having the volume of A and B liters respectively. The following ...

  8. autoplay media studio couldn't load

    AutoPlay Media Studio 7 (English version) is installed on target machine. Following error occurred w ...

  9. hibernate细节一

    public void saveUser(){        Session session=JdbcUtil.getSession();        User user=new User();   ...

  10. Android LayoutInflater.inflate使用上的问题解惑

    最近在在使用LayoutInflater.inflate方法时遇到了一些问题,以前没有仔细看过此类的使用方法,故将其记录下来,方便日后查阅. 相信大家都知道LayoutInflater.inflate ...