介绍

接口的介绍我们从三个方面来说:

  • 从使用上来说是继承的一种扩展,因为java不支持多继承,而有了接口就能够实现多继承的效果。
  • 有时候需要必须从几个类中抽取出一些共同的行为特征,而它们之间又没有继承的关系,仅仅是具有相同的行为特征而已,比如人和动物都会跑,但是他们不是属于一类的,而且跑的行为的表现形式不一样,他们仅仅都具有跑这个行为而已。
  • 接口可以看出是一种规范,标准,它用来定义了一组规则。如果你需要用到了该接口(再次强调不是继承的关系),那你必须要遵守这个规范。

定义

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

换句话说就是:接口,是Java语言中一种引用类型,是方法的集合,接口的内部只是声明了方法,并没有实现(也不能实现)。

注:引用数据类型:数组,类,接口

接口声明格式

【修饰符】 interface 接口名 [extends 其他的接口名]{//接口的成员列表:// 静态常量// 抽象方法// 默认方法// 静态方法// 私有方法
}

接口声明需要注意:

  • 接口是隐式抽象的,当声明一个接口的时候,不必使用abstract关键字。
  • 接口中每一个方法也是隐式抽象的,声明时同样不需要abstract关键字。
  • 接口中的方法都是公有的。

JDK 1.8之前

  • 接口中所有的成员变量,默认都是共有的静态常量(其中public static final可以省略)
  • 接口中的所有成员方法,默认都是共有的抽象方法(其中public abstract可以省略)
  • 接口不能实例化对象的,也没有构造器
  • 没有初始化块

在JDK 1.8时

  • 接口中允许声明默认方法(public 可以省略,建议保留)
    default void 方法名(){ 方法体 }
    使用方法: 对象名.方法名;
    可以被实现类重写
  • 接口中允许声明静态方法(public 可以省略,建议保留)
    static void 方法名(){ 方法体 }
    使用方法:接口名.方法名(); 一般使用在工具方法上

实现

当接口被定义后,一个或者多个类都可以实现该接口(前面说的几个类中抽取出一些共同的行为特征),也可以一个类实现多个接口。接口的实现需要在相应的类的定义中包含 implements关键字。

语法格式

【修饰符】 class 实现类  implements 接口1【,接口2, ...】{ //一个类可以同时实现多个接口// 重写接口中抽象方法【必须】,当然如果实现类是抽象类,那么可以不重写// 重写接口中默认方法【可选】
}

接口实现需要注意:

  • 必须重写接口中所有抽象方法。
  • 继承了接口的默认方法,即可以直接调用,也可以重写。
    重写时,default单词就不要再写了,它只用于在接口中表示默认方法,到类中就没有默认方法的概念了
  • 不能重写静态方法
  • 如果多个接口中有抽象方法有重名的,只需要重写一次

代码示例

public interface Attack {void attack();
}public interface Fly extends Aa,Ba{int id = 1; // 默认共有的静态常量void method(); //默认共有的抽象方法}public class Aircraft implements Fly,Attack {//所有的抽象方法都得实现@Overridepublic void attack() {System.out.println("攻击");}@Overridepublic void method() {}}

接口中方法的调用

说明

对于接口的抽象方法、默认方法,通过实现类对象就可以调用;
但是对于接口的静态方法,必须使用接口名才能调用

代码实例

public interface Fly {public void fly(); //抽象方法//静态方法(默认共有的)static void staticMethod(){System.out.println("Fly中的静态方法");}//默认方法default void defauleMethod(){System.out.println("Fly中的默认方法");}
}public class Aircraft implements Fly {@Overridepublic void fly() {System.out.println("飞机会飞");}@Overridepublic void defauleMethod() {System.out.println("飞机重写的默认方法");}}public class Demo1 {public static void main(String[] args) {Fly.staticMethod();//接口的静态方法可以通过接口名调用Aircraft aircraft = new Aircraft();//        aircraft.staticMethod(); 静态方法不能通过对象调用//        Fly.defaultMethod(); 默认方法不能通过接口调用调用aircraft.defauleMethod();//默认方法通过对象调用}
}

接口的继承

说明

一个接口能继承另一个接口,和类之间的继承方式比较相似。接口的继承使用extends关键字,子接口继承父接口的方法。在Java中,类的多继承是不合法,但接口允许多继承(类的扩展的体现)。在接口的多继承中extends关键字只需要使用一次,在其后跟着其他需要继承接口。

语法格式

public interface 接口名1 extends 接口名2 【, 接口名2,...】{ }

子接口继承父接口的方法;如果实现了某一个接口,其父类的抽象方法也必须实现
子接口重写默认方法时,default关键字可以保留。

代码示例

interface A {void a();public default void methodA(){System.out.println("接口A的方法");}
}interface B {void b();public default void methodB(){System.out.println("接口B的方法");}
}interface C extends A,B{@Overridepublic default void methodB() {System.out.println("接口C的方法");}
}class D implements C{@Overridepublic void a() {System.out.println("xxxxx");}@Overridepublic void b() {System.out.println("yyyyy");}}

标记接口

介绍

最常用的继承接口是没有包含任何方法的接口,称为标记接口。

标记接口是没有任何方法和属性的接口。它仅仅表明它的类属于一个特定的类型,供其他代码来测试允许做一些事情。

标记接口作用

简单形象的说就是给某个对象打个标(盖个戳),使对象拥有某个或某些特权。

  • 建立一个公共的父接口:
    你可以使用一个标记接口来建立一组接口的父接口。例如:当一个接口继承了EventListener接口,Java虚拟机(JVM)就知道该接口将要被用于一个事件的代理方案。

  • 向一个类添加数据类型:
    这种情况是标记接口最初的目的,实现标记接口的类不需要定义任何接口方法(因为标记接口根本就没有方法),但是该类通过多态性变成一个接口类型。

举例

java.awt.event 包中的 MouseListener 接口继承的 java.util.EventListener 接口定义如下:

package java.util;
public interface EventListener{ }

经典接口介绍

java.lang.Comparable

基本数据类型的数据(除boolean类型外)需要比较大小的话,直接使用比较运算符即可,但是引用数据类型是不能直接使用比较运算符来比较大小的,而这个又是比较常用的。那么,如何解决这个问题呢?

Java给所有引用数据类型的大小比较方式,即指定了一个标准接口,就是java.lang.Comparable接口:

package java.lang;public interface Comparable{int compareTo(Object obj);
}

如果想要比较某个类的对象的大小时候时,按照如下步骤执行:

第一步:哪个类的对象要比较大小,哪个类就实现java.lang.Comparable接口,并重写方法

  • 方法体就是你要如何比较当前对象和指定的另一个对象的大小

第二步:对象比较大小时,通过对象调用compareTo方法,根据方法的返回值决定谁大谁小。

  • this对象(调用compareTo方法的对象)大于指定对象(传入compareTo()的参数对象)返回正整数
  • this对象(调用compareTo方法的对象)小于指定对象(传入compareTo()的参数对象)返回负整数
  • this对象(调用compareTo方法的对象)等于指定对象(传入compareTo()的参数对象)返回零

代码示例

package com.atguigu.bean;public class Person implements Comparable{private int id;private String name;private int age;public Person() {}public Person(int id, String name, int age) {this.id = id;this.name = name;this.age = age;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic String toString() {return "Person{" +"id=" + id +", name='" + name + '\'' +", age=" + age +'}';}/*根据年龄排序*/@Overridepublic int compareTo(Object o) {//多态参数  Object o=new Person()if (this == o)return 0; //地址一样,则相同if (o instanceof Person){Person per = (Person)o;return this.age - per.age;}return -1; //类型不一致,直接小于}
}import com.atguigu.bean.Person;import java.util.Arrays;public class Demo2 {public static void main(String[] args) {Person[] persons=new Person[5];persons[0]=new Person(1,"翠花",18);persons[1]=new Person(2,"小芬",28);persons[2]=new Person(3,"lily",16);persons[3]=new Person(4,"狗蛋",38);persons[4]=new Person(5,"石破天",19);Arrays.sort(persons);for (int i = 0; i < persons.length ; i++) {System.out.println(persons[i].toString());}}}

java.util.Comparator

如果一个类,实现了Comparable接口,也指定了两个对象的比较大小的规则(也可能没有实现),但是此时此刻如果不想按照它预定义的方法比较大小,该怎么办?(不能随意修改,因为会影响其他地方的使用)

JDK在设计类库之初,也考虑到这种情况了,所以又增加了一个java.util.Comparator接口。

package java.util;public interface Comparator{int compare(Object o1,Object o2);
}

如果想要比较某个类的对象的大小时候时,按照如下步骤执行:

第一步:编写一个类,我们称之为比较器类型,实现java.util.Comparator接口,并重写方法

  • 方法体就是你要如何指定的两个对象的大小

第二步:比较大小时,通过比较器类型的对象调用compare()方法,将要比较大小的两个对象作为compare方法的实参传入,根据方法的返回值决定谁大谁小。

  • o1对象大于o2返回正整数
  • o1对象小于o2返回负整数
  • o1对象等于o2返回零

代码示例

import com.atguigu.bean.Employee;import java.util.Arrays;
import java.util.Comparator;public class Demo3 {public static void main(String[] args) {Employee[] employees = new  Employee[5];employees[0] = new Employee(1,"jack1",2000.6);employees[1] = new Employee(2,"jack2",1001);employees[2] = new Employee(3,"jack3",5000);employees[3] = new Employee(4,"jack4",2000.3);employees[4] = new Employee(5,"jack5",3000);Arrays.sort(employees,new Myclass());for (int i = 0; i < employees.length; i++) {System.out.println(employees[i]);}}
}class Myclass implements Comparator {/*按照薪资进行排序*/@Overridepublic int compare(Object o1, Object o2) {if (o1 == o2)return 1;if (o1 instanceof Employee && o2 instanceof Employee){Employee employee1 = (Employee) o1;Employee employee2 = (Employee) o2;return (int) (employee1.getSalary() - employee2.getSalary());}return -1;}
}

零基础Java学习之接口相关推荐

  1. java学习笔记:零基础java学习路线+配套资料+书籍推荐

    公众号菜鸟名企梦2018年,精品文章汇总: 01 我的秋招 我的秋招offer 我的offer选择 秋招全面总结-必读宝典 求职必读 02 零基础学习路线 零基础-java学习路线(上) 零基础-ja ...

  2. 授人予鱼不如授人予渔:零基础java学习路线分享

    一切不以求职找工作为目标的学习路线分享都是耍流氓. 博主是19年7月毕业的应届生:985.A+学科硕士.2018年的秋招收获了:百度.腾讯.头条.美团.猿辅导.度小满.猫眼.流利说等offer.off ...

  3. 零基础——java学习路线(下)

    学习路线分上中下三篇,前两篇已经发布了,本文是学习路线系列的最后一篇.有没有提到的点或学习疑问欢迎评论区留言~ 公众号后台回复"资料"即可获取学习资料大礼包,你想找的基本都有,外加 ...

  4. 零基础Java学习之多态

    介绍 多态是Java的三大特性之一,另外两个分别是:继承和封装(前面博客已经说了继承和封装了,可以看一下).这两个可以说在一定程度了为多态打下了基础. 通过多态,可以实现一个行为具有多种形态,这里的形 ...

  5. 零基础Java学习之继承

    继承 继承的概述 继承的理解 继承的好处 继承的格式 继承的特点一:成员变量 私有化(private) 成员变量不重名 成员变量重名 继承的特点二:成员方法 成员方法不重名 成员方法重名--重写(Ov ...

  6. 零基础Java学习之包(Package)

    包的作用 1.可以避免类重名 有了包之后,类的全名称就变为:包.类名 2.分类组织管理众多的类 例如: java.lang----包含一些Java语言的核心类,如String.Math.Integer ...

  7. 零基础Java学习之成员变量

    成员变量 成员变量的分类 实例变量:也叫对象属性,属于某个对象的,通过对象来使用 类变量:属于整个类的,不是属于某个实例,后面static部分讲解. 如何声明实例变量? [修饰符] class 类名{ ...

  8. 零基础Java学习之抽象类

    抽象类 介绍 抽象:即不具体.或无法具体 例如:当我们声明一个几个图形类:圆.矩形.三角形类等,发现这些类都有共同特征:求面积.求周长.获取图形详细信息.那么这些共同特征应该抽取到一个公共父类中.但是 ...

  9. 零基础Java学习之初级项目实践(客户信息管理软件-附源码)

    项目涉及知识点 基础的面向对象编程项目. 类和对象(属性.方法及构造器) 类的封装 引用数组 数组的插入.删除和替换 对象的聚集处理 多对象协同工作 需求说明 总体说明 模拟实现基于文本界面的< ...

最新文章

  1. 【Qt】QTest:编译Qt单元测试程序
  2. React学习(1)——JSX语法与React组件
  3. linux ruby 安装路径,Linux(CentOS 7)安装ruby
  4. Github上都没有的“网约车”项目,终于有人给写出来了!
  5. 《学习CSS布局》学习笔记
  6. 笨办法学 Python · 续 练习 32:扫描器
  7. Google 与微软的浏览器之争
  8. p语言是python吗-为什么说Python是一门动态语言--Python的魅力
  9. rpcbind相关漏洞验证
  10. blender导出html,神器,C4D互导插件,可与Maya和Blender模型快速复制粘贴导出脚本Quick CopyPaste (Blender, Maya, C4D)...
  11. 鸿蒙无锡有什么特产,无锡太湖鼋头渚十大特产
  12. 仿百度糯米TP5项目笔记
  13. 《Effective Java》读书笔记五(枚举和注解)
  14. 【leetcode】2248. 多个数组求交集(js实现)
  15. 陕西延安一男子看钓鱼忘拉手刹,爱车溜进鱼塘:自己都惊呆了
  16. 如何使计算机每隔X秒按一次键
  17. 【leetcode 993】【二叉树的堂兄弟节点】
  18. 网站引用阿里云oss里面的远程字体图标不显示解决方案
  19. 7-8 金银铜牌 (15 分)
  20. latex的图的排列方法_latex多幅图片排列 2*2示例

热门文章

  1. 信道编码之编码理论依据
  2. 平安技术开放日质量保证技术专场第一期 [附部分 ppt]
  3. 【log】12/11 checking project:(Laravel)snsTest
  4. Android中使用running services查看service进程内存
  5. 亚马逊AWS在线系列讲座——基于AWS云平台的高可用应用设计
  6. c#初学-索引器get和set的使用(泛型类)
  7. 创建与SharePoint 2010风格一致的下拉菜单 (续) 整合Feature Custom Action框架
  8. WF流程设计器升级说明
  9. 王者荣耀s22服务器未响应是什么意思,王者荣耀s22资源包升级失败 s22解析包出现问题解决方法...
  10. 频谱中负频率的物理意义(二)