头图

Java 中的接口还可以这样用,你知道吗?

Java 程序员都知道要面向接口编程,那 Java 中的接口除了定义接口方法之外还能怎么用你知道吗?今天阿粉就来带大家看一下 Java 中的接口还可以有哪些用法。

基本特性

我们先看一下接口的基本特性

  1. 接口的定义需要使用关键字 interface
  2. 接口定义的所有方法默认都是 public abstract
  3. 当一个具体的 class 去实现一个interface时,需要使用implements 关键字;
  4. 接口之间是可以多继承,而类是只能单继承的;

如下所示,我们定义一个接口

package com.example.demo.inter;

import java.io.Serializable;
import java.util.RandomAccess;

/**
 * <br>
 * <b>Function:</b><br>
 * <b>Author:</b>@author java 极客技术<br>
 * <b>Date:</b>2022-09-24 17:38<br>
 * <b>Desc:</b>无<br>
 */
public interface ITest extends Serializable, RandomAccess {

  public abstract String sayHello();
  String sayHello2();// public abstract 可以省略

}

默认方法

JDK 8 之前接口是不支持默认方法的,在 JDK 8 之后接口支持默认方法,默认方法采用关键词 default 声明。

public interface ITest extends Serializable, RandomAccess {

  public abstract String sayHello();
  String sayHello2();// public abstract 省略
  
  // 默认方法
  default String sayHello3() {
    return "hello3";
  }

}

默认方法跟抽象方法不一样,接口中定义的抽象方法,当接口被其他类实现的时候都需要全部实现,但是默认方法是不需要被实现就可以直接使用的,类似于直接调用父类的方法一样,所以在很多时候,我们已经继承了一个类,还想有一个能用但是不想每个子类都实现的方法的时候,就可以考虑增加一个接口的默认方法来使用,简单来说就是实现类可以不覆写 default 方法。

default方法存在的目的是,在我们已经完善的项目中,如果我们直接给一个接口增加一个方法,在没有默认方法的时候就需要给所有的实现类都实现对应的方法,但是这个方法又不一定是每个实现类都需要的,所以这个时候默认方法就很好的解决了这个问题,我们只需要增加一个默认方法,然后在需要使用的实现类中进行实现或者使用就可以了,其他的实现类不需要改动任何的代码。

标记

接口还有一个很常见的功能那就是标记功能,这么说可能你没有印象,但是到提到序列化接口 java.io.Serializable; 你肯定知道,我们经常在对应的 POJO 中都会实现这个序列化接口,而这个序列化的接口如果看过源码的小伙伴肯定知道里面是没有内容的。

同样的功能除了序列化的接口,类似的空接口还有很多,比如 java.util.RandomAccess 也是空接口,之前阿粉也写过关于 RandomAccess 这个接口的用途,感兴趣的可以再去看看。 RandomAccess 明明是个空接口,能有什么用呢?

通过源码我们可以知道 RandomAccess 是用来标识子类是否实现了该接口,如果实现了则走实现了的逻辑,没有实现就走没有实现的逻辑,所以我们在日常开发中也可以利用这个特性,当我们有不同的子类需要根据情况进行不同的实现逻辑的时候就可以采用定义一个空接口来标记一下,方便后面的处理。

静态方法

跟默认方法一样,JDK 8 还支持在接口中增加静态方法,虽然说在接口中定义静态方法的做法不常见,但是当需要使用的时候也是可以支持的,避免在创建一个单独的工具类,跟在类中定义的静态方法一样,我们可以直接通过接口名称引用静态方法,当然静态变量也是可以的,使用方法一样。

public interface ITest extends Serializable, RandomAccess {

  public abstract String sayHello();
  String sayHello2();// public abstract 可以省略
  default String sayHello3() {
    System.out.println(sayHello4());
    return "hello3";
  }
  public static String sayHello4() {
    return "hello4";
  }
}

私有方法

大家有没有注意到,上面不管是默认方法还是静态方法其实都是 public 公开的,可以让实现类或者其他类直接使用,那有没有可能在接口中定义一个私有方法呢?在 JDK 9 之前是不可以的,JDK 9 却支持了,如下所示

  private void privateMethod() {
    System.out.println("private私有方法被调用");
  }

  private static void privateStaticMethod() {
    System.out.println("private私有静态方法被调用");
  }

从官方的文档中我们可以找到下面的描述,在 JDK 9 中接口支持私有方法,主要用于不同的非抽象方法中共享代码。

我们可以看到在 JDK 9 这样写是可以的

但是在 JDK8 就不行了,是无法编译通过的,会提示不允许使用 private 修饰符。

总结

今天阿粉给大家总结了一个接口的使用方法,后面在日常的开发中我们不单单只是在接口中定义抽象方法,也可以根据需求增加默认方法或者私有方法,以及在需要用到标记的时候也可以通过定义一个空接口来实现,怎么样是不是很棒,感觉动起来吧。最后觉得我们的文章有帮助,欢迎一键三连。

本文由mdnice多平台发布


Java_tech
阿里巴巴高级开发工程师,公众号【Java极客技术】联合创始人,B站【浅析计算广告】博主
61 声望
13 粉丝
0 条评论
推荐阅读
手把手教你将 ChatGPT 接入企业微信
之前给大家介绍了如何将 ChatGPT 接入个人微信、钉钉以及知识星球,没看过的小伙伴可以点击链接进去看一下。但是众所周知,接入个人微信是有风险的,官方是不允许我们通过非法的客户端进行登录的。今天给大家分享...

Java极客技术阅读 889

封面图
花了几个月时间把 MySQL 重新巩固了一遍,梳理了一篇几万字 “超硬核” 的保姆式学习教程!(持续更新中~)
MySQL 是最流行的关系型数据库管理系统,在 WEB 应用方面 MySQL 是最好的 RDBMS(Relational Database Management System:关系数据库管理系统)应用软件之一。

民工哥14阅读 2k

封面图
算法可视化:一文弄懂 10 大排序算法
在本文中,我们将通过动图可视化加文字的形式,循序渐进全面介绍不同类型的算法及其用途(包括原理、优缺点及使用场景)并提供 Python 和 JavaScript 两种语言的示例代码。除此之外,每个算法都会附有一些技术说...

破晓L8阅读 992

封面图
硬卷完了!MongoDB 打怪升级进阶成神之路( 2023 最新版 )!
前面我们学习:MySQL 打怪升级进阶成神之路、Redis 打怪升级进阶成神之路,然后我们还在继续 NoSQL 的卷王之路。从第一篇文章开始,我们逐步详细介绍了 MogoDB 基础概念、安装和最基本的CURD操作、索引和聚合、工...

民工哥7阅读 651

封面图
「刷起来」Go必看的进阶面试题详解
逃逸分析是Go语言中的一项重要优化技术,可以帮助程序减少内存分配和垃圾回收的开销,从而提高程序的性能。下面是一道涉及逃逸分析的面试题及其详解。

王中阳Go4阅读 2k评论 1

封面图
架构设计-高性能篇
大家好,我是易安!今天我们谈一谈架构设计中的高性能架构涉及到的底层思想。本文分为缓存架构,单服务器高性能模型,集群下的高性能模型三个部分,内容很干,希望你仔细阅读。

架构狂人4阅读 820

Nginx常用配置及和基本功能讲解 | 京东云技术团队
作者:京东物流 殷世杰Nginx已经广泛应用于J-one和Jdos的环境部署上,本文对Nginx的常用的配置和基本功能进行讲解,适合Nginx入门学习。1 核心配置找到Nginx安装目录下的conf目录下nginx.conf文件,Nginx的基本功...

京东云开发者6阅读 624

封面图
61 声望
13 粉丝
宣传栏