IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> Java中有关接口知识的小结 -> 正文阅读

[Java知识库]Java中有关接口知识的小结

业精于勤荒于嬉,行成于思毁于随。


接口的作用

接口(interface)实际上就是一种公共规范,对实现这个接口的类的一组需求。如同现实生活中的契约,规定了“你是…就应该能干…”。是一台汽车,就应该能跑。例如一个移动硬盘实现了USB接口,那它就应该能做USB接口规定要做的事,例如传输数据。
因此,接口中可以定义一些抽象的方法,来规定实现类需要做的事,如果一个类实现了这个接口,那这个类就需要覆盖重写这些抽象方法,来具体化方法的内容。


接口不能创建对象,因为接口的目的是对一个类做出规范,其本身无需实例化对象。

怎么实现接口

实现接口的关键字为 implements,如果一个 Keyboard 类需要实现 Usb 接口:

public class Keyboard implements Usb {}

与类的单继承不同的是,接口是多实现的,一个类可以实现多个接口,中间用,隔开:

public class Keyboard implements Usb, Bluetooth {}

接口之间也有继承关系,并且接口只能继承接口,而不能继承类。如果想让 Usb 接口继承 TypeC 接口,需要用到关键字extends,写法如下:

public interface Usb extends TypeC {}

接口中可以包含哪些内容

  • 接口中可以包含常量

public class Keyboard {
	public static final int SIZE;
}

public,static,final可以省略不写,接口中的成员变量默认为这三个关键字修饰。

  • 接口中可以包含抽象方法

public class Usb{
	public abstract void close();
}

public,abstract关键字可以省略不写,效果相同。抽象方法用来规定类必须要做的事,因此是接口当中最重要的内容。如果一个类实现了接口,就必须重写接口当中的所有抽象方法,否则这个类自己必须是抽象类

  • 接口当中可以包含静态方法和私有方法

public class Usb{
	public static void sayHello(){. // 静态方法
		System.out.println("Hello");
	}

	private void printHello(){. //私有方法
		System.out.println("Hello");
	}
}

Java8 以后,接口中可以使用静态方法,静态方法中的public同样可以省略不写。
Java9 以后接口可以使用私有方法私有方法主要是给接口中的其他方法提供服务,对接口外隐藏。

  • 接口当中可以包含默认方法

public class Usb{
	public default void start(){  //默认方法
        System.out.println("开始!");
    }
}

Java8以后接口中可以定义带有具体实现的默认方法,如上代码,public 关键字可以省略。
默认方法主要用来解决接口的升级的问题,假设在很早之前就定义的一个接口,有大量用户在使用,而接口的设计者此时觉得需要增加一个新方法来扩展接口的功能,如果他给接口增加的是抽象方法,那么那些实现了该接口的类就不得不修改自己的代码来重写这个新的抽象方法,否则原来的代码就会报错。但是不见得每个人都需要这个新加的功能,所以接口的设计者就可以考虑使用默认方法。这样即使接口增加了功能,也不会影响到之前的实现类,倘若用户需要这个新功能,就可以覆盖重写这个默认方法,如果不需要也可以置之不理,而不用担心自己原先的代码受到影响。

不同接口中方法的冲突

接口中存在四种方法:抽象方法静态方法私有方法默认方法
方法冲突指的是不同接口中提供了方法名称和参数列表都相同的方法,子类实现时就会造成矛盾。

  1. 抽象方法无论如何都是要被实现类重写的(或者实现类是抽象类),所以多个接口抽象方法冲突也无关紧要。
  2. 静态方法是通过接口名称调用的,所以多个接口的静态方法冲突也互不影响。
  3. 私有方法为接口本身才能使用,对外隐藏,所以多个接口私有方法冲突也没有问题。
    因此只需要讨论默认方法冲突的问题
  • 超类具体方法与接口默认方法冲突

    遵循超类优先的原则,如果超类提供了一个具体的方法,那么接口中同名且参数相同的默认方法会被忽略。
  • 接口之间默认方法冲突

    如果一个类同时实现的多个接口中存在冲突的默认方法,那么这个类必须重写冲突的方法,否则会报错。
  • 接口间默认方法与抽象方法的冲突

    人们很容易想当然的认为,既然一个方法是有具体实现的默认方法,另一个是没有方法体的抽象方法,那么实现类理应自动选择继承默认方法。很遗憾事实并非如此,Java设计者更强调一致性,两个接口如何冲突并不重要,只要两个冲突的方法有一个有具体实现,那么都会报错,程序员必须解决这个问题:自身申明为抽象类 或者 重写冲突的方法

接口和抽象类的区别

虽然二者都有抽象方法用来规范类的行为,但是也存在一些差别。

  1. 接口当中不能有构造方法,抽象类可以有构造方法。
  2. 接口当中只能定义常量,抽象类可以定义实例字段。
  3. 一个类可以实现多个接口(多实现),但是只能继承一个抽象类(单继承)。

从第3点不难看出,因为类的单继承性,使用抽象类表示通用属性存在严重的问题:继承一个类之后,就无法再扩展第二个类了。但是多继承又会让代码和类的关系杂乱不堪且效率低下,比如C++,Eiffel。
但是接口的使用可以提供多重继承的大多数好处,同时还能避免多继承的复杂性和低效性。

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-07-23 10:35:34  更:2021-07-23 10:37:28 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/18 17:38:28-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码