引言

接口这个词在生活中我们并不陌生。

在中国大陆,我们可以将自己的家用电器的插头插到符合它插口的插座上;

我们在戴尔,惠普,联想,苹果等品牌电脑之间传输数据时,可以使用U盘进行传输。

插座的普适性是因为大部分都是国标的;U盘可以插到这些电脑上,是因为都遵循了USB2.0或者USB3.0的标准。

在遵循相同标准的前提下,就出现了接口。

接口的定义

由引言可知,接口就是多个类之间的公共规范。

我们知道,普通类的定义是这样的

public class 类名{

}

接口的定义把class换成interface便可以了,如下所示:

public interface 接口名{

}

接口中定义抽象方法

接口中抽象方法的定义如下:

public abstract 方法返回类型 方法名();

其中public和abstract是可以省略的。从而,可以简写为如下形式:

方法返回类型 方法名();

接口的抽象方法的使用

接口是不能new对象实例的。那我们怎么调用接口的抽象方法呢?

我们需要新定义一个类来实现这个接口,然后覆盖重写接口中所有的抽象方法。其中实现接口的类定义方式如下:

public class 类名 implements 需要实现的接口名{
//重写所有抽象方法
}

比如,可以定义一个接口和一个实现类,然后再定义一个类,来调用方法。

package com.sjdwz;

/**
* @Description 接口示例代码
* @Date 2022/3/17
* @Created by 随机的未知 sjdwz.com
*/
public interface MyInterfaceStudy1 {
public abstract void test01();
}
package com.sjdwz;

/**
* @Description MyInterfaceStudy1接口的实现
* @Date 2022/3/17
* @Created by 随机的未知 sjdwz.com
*/
public class MyInterfaceStudy1Impl implements MyInterfaceStudy1{
@Override
public void test01() {
System.out.println("实现了接口MyInterfaceStudy1的test01方法");
}
}
package com.sjdwz;

/**
* @Description 接口抽象方法使用测试
* @Date 2022/3/17
* @Created by 随机的未知 sjdwz.com
*/
public class MyInterfaceStudyTest1 {
public static void main(String[] args) {
MyInterfaceStudy1Impl myInterfaceStudy1 = new MyInterfaceStudy1Impl();
myInterfaceStudy1.test01();
}
}

注意:如果没有覆盖重写所有的抽象方法,那么本实现类需要是一个抽象类。

接口中定义默认方法

假设某场景下,我们的接口需要进行升级,必须添加某些方法来满足新的需要,如果我们再定义抽象方法的话,那么我们之前实现该接口的所有非抽象类都需要重新进行修改。

那么有没有一种办法,能够让我们不改动接口实现类的代码就能完成接口的升级呢?

在Java8中对此给出了答案。

我们可以在接口中定义默认方法。

定义方式如下:

public default 方法返回类型 方法名(){
//方法里面需要执行的内容
}

public可以省略。

接口的默认方法的使用

我们在定义接口的实现类时,不需要对默认方法进行覆盖重写,就可以使用该方法。请看如下的例子:

接口类的定义

package com.sjdwz;

/**
* @Description 接口的默认方法
* @Date 2022/3/17
* @Created by 随机的未知 sjdwz.com
*/
public interface MyInterfaceStudy2 {
default void defaultFucTest01(){
System.out.println("我在defaultFucTest01中,我是一个默认方法,我解决了接口升级的问题");
}
void testAbstarct();
}

两个实现类的定义

package com.sjdwz;

/**
* @Description TODO
* @Date 2022/3/17
* @Created by 随机的未知 sjdwz.com
*/
public class MyInterfaceStudy2Impl implements MyInterfaceStudy2{
@Override
public void testAbstarct() {
System.out.println("我在MyInterfaceStudy2Impl中,我重写了MyInterfaceStudy2中的抽象方法");
}
}
package com.sjdwz;

/**
* @Description TODO
* @Date 2022/3/17
* @Created by 随机的未知 sjdwz.com
*/
public class MyInterfaceStudy2DefaultImpl implements MyInterfaceStudy2{
@Override
public void defaultFucTest01() {
System.out.println("我在MyInterfaceStudy2DefaultImpl中,我重写了MyInterfaceStudy2的默认方法");
}
@Override
public void testAbstarct() {
System.out.println("我在MyInterfaceStudy2DefaultImpl中,我重写了MyInterfaceStudy2的默认方法");
}
}

它们的使用:

package com.sjdwz;

/**
* @Description TODO
* @Date 2022/3/17
* @Created by 随机的未知 sjdwz.com
*/
public class MyInterfaceStudyTest2 {
public static void main(String[] args) {
MyInterfaceStudy2Impl myInterfaceStudy2 = new MyInterfaceStudy2Impl();
myInterfaceStudy2.defaultFucTest01();
myInterfaceStudy2.testAbstarct(); MyInterfaceStudy2DefaultImpl myInterfaceStudy2Default = new MyInterfaceStudy2DefaultImpl();
myInterfaceStudy2Default.defaultFucTest01();
myInterfaceStudy2Default.testAbstarct();
}
}

输出如下:

由此可见,接口实现类如果没有重写接口中的默认方法,会去调用接口中的默认方法;如果实现类重写了接口的默认方法,便会调用重写的方法。

接口中定义静态方法

定义方式如下

public static 方法返回类型 方法名(){
//方法里面需要执行的内容
}

public可以省略

接口的静态方法的使用

定义接口如下:

package com.sjdwz;
/**
* @Description 接口中的静态方法
* @Date 2022/3/17
* @Created by 随机的未知 sjdwz.com
*/
public interface MyInterfaceStudy3 {
static void staticFuc(){
System.out.println("我在MyInterfaceStudy3接口中,这是我的静态方法");
}
}

该接口的实现类如下

package com.sjdwz;

/**
* @Description 实现类
* @Date 2022/3/17
* @Created by 随机的未知 sjdwz.com
*/
public class MyInterfaceStudy3Impl implements MyInterfaceStudy3{
}

如果我使用方式如下可以吗?

强大的Java编辑器已经帮我们提示错误了。这样使用是不可以的。

正确使用方式时接口名.静态方法名(参数);

package com.sjdwz;

/**
* @Description 接口静态方法的使用测试
* @Date 2022/3/17
* @Created by 随机的未知 sjdwz.com
*/
public class MyInterfaceStudyTest3 {
public static void main(String[] args) {
MyInterfaceStudy3.staticFuc();
}
}

输出如下

接口中定义常量

定义方式如下

public static final 数据类型 常量名 = 666;

其中public static final可以省略。

一般常量名的每个字母都大写,如果时多个单词,使用下划线连接。

如下所示:

int NUM = 666;
int DAILY_HOURS = 24;

接口中常量的使用

定义接口如下:

package com.sjdwz;
/**
* @Description 接口中定义常量
* @Date 2022/3/17
* @Created by 随机的未知 sjdwz.com
*/
public interface MyInterfaceStudy4 {
int NUM = 666;
int DAILY_HOURS = 24;
}

实现类如下

package com.sjdwz;

/**
* @Description 实现类
* @Date 2022/3/17
* @Created by 随机的未知 sjdwz.com
*/
public class MyInterfaceStudy4Impl {
}

我们可以使用如下吗?

很明显,又提示错误了。不能使用实现类.常量实现类的对象.常量来使用。

正确使用如下:

package com.sjdwz;

/**
* @Description 接口的常量使用测试
* @Date 2022/3/17
* @Created by 随机的未知 sjdwz.com
*/
public class MyInterfaceStudyTest4 {
public static void main(String[] args) {
System.out.println("用接口来访问接口中的常量NUM:======"+MyInterfaceStudy4.NUM);
System.out.println("用接口来方法接口中的常量DAILY_HOURS:======"+MyInterfaceStudy4.DAILY_HOURS);
}
}

输出如下:

原文链接为:https://sjdwz.com/11171.html

详解java接口interface的更多相关文章

  1. 第十八节:详解Java抽象类和接口的区别

    前言 对于面向对象编程来说,抽象是它的特征之一. 在Java中,实现抽象的机制分两种,一为抽象类,二为接口. 抽象类为abstract class,接口为Interface. 今天来学习一下Java中 ...

  2. Protocol Buffer技术详解(Java实例)

    Protocol Buffer技术详解(Java实例) 该篇Blog和上一篇(C++实例)基本相同,只是面向于我们团队中的Java工程师,毕竟我们项目的前端部分是基于Android开发的,而且我们研发 ...

  3. 详解java动态代理机制以及使用场景

    详解java动态代理机制以及使用场景 https://blog.csdn.net/u011784767/article/details/78281384 深入理解java动态代理的实现机制 https ...

  4. 详解Java中的clone方法

    详解Java中的clone方法 参考:http://blog.csdn.net/zhangjg_blog/article/details/18369201/ 所谓的复制对象,首先要分配一个和源对象同样 ...

  5. 异常处理器详解 Java多线程异常处理机制 多线程中篇(四)

    在Thread中有异常处理器相关的方法 在ThreadGroup中也有相关的异常处理方法 示例 未检查异常 对于未检查异常,将会直接宕掉,主线程则继续运行,程序会继续运行 在主线程中能不能捕获呢? 我 ...

  6. 详解 Set接口

    (请关注 本人"集合"总集篇博文--<详解 Collection接口>) 在Collection接口的子接口中,最重要的,也是最常见的两个-- List接口 和 Set ...

  7. 「跬步千里」详解 Java 内存模型与原子性、可见性、有序性

    文题 "跬步千里" 主要是为了凸显这篇文章的基础性与重要性(狗头),并发编程这块的知识也确实主要围绕着 JMM 和三大性质来展开. 全文脉络如下: 1)为什么要学习并发编程? 2) ...

  8. 详解Java GC的工作原理+Minor GC、FullGC

    详解Java GC的工作原理+Minor GC.FullGC 引用地址:http://www.blogjava.net/ldwblog/archive/2013/07/24/401919.html J ...

  9. 详解EBS接口开发之库存事务处理采购接收--补充

    除了可以用  详解EBS接口开发之库存事务处理采购接收的方法还可以用一下方法,不同之处在于带有批次和序列控制的时候实现方式不同 The script will load records into ...

随机推荐

  1. js 数组map用法 Array.prototype.map()

    map 这里的map不是"地图"的意思,而是指"映射".[].map(); 基本用法跟forEach方法类似: array.map(callback,[ thi ...

  2. Java GUI 简单台球游戏模型

    完成效果: 1 package com.neuedu.test; 2 3 import java.awt.Frame; 4 import java.awt.Graphics; 5 import jav ...

  3. Solution -「多校联训」排水系统

    \(\mathcal{Description}\)   Link.   在 NOIP 2020 A 的基础上,每条边赋权值 \(a_i\),随机恰好一条边断掉,第 \(i\) 条段的概率正比于 \(a ...

  4. Solution -「JOISC 2021」「LOJ #3495」聚会 2

    \(\mathcal{Description}\)   Link.   给定一棵含 \(n\) 个结点的树.称点集 \(S\) 到结点 \(u\) 的会合距离为 \(\sum_{v\in S}\ope ...

  5. Intellij IDEA出现java.lang.ClassNotFoundException: com.mysql.jdbc.Driver处理办法

    菜单-->File-->project structure-->Modules-->Dependencies-->添加MySQL的驱动包:mysql-connector- ...

  6. Python基础—名称空间(Day10)

    一.名称空间和作用域 1.全局名称空间(名称空间.命名空间): py文件运行时代码从上之下依次执行,看到一个变量就会将这个变量与对应值的内存地址的关系存到名称空间里,代码要运行时(print时)从名称 ...

  7. json系列(二)cjson,rapidjson,yyjson大整数解析精度对比

    前言上一篇介绍了3种json解析工具的使用方法,对于基础数据的解析没有任何问题.我们传输的json数据里有unsigned long型数据,需要借助json解析工具得到正确的unsigned long ...

  8. java策略模式拙见

    面向对象的两个基本准则: 单一职责:一个类只有一个发生变化的原因 开闭原则:对拓展开放,对修改关闭 <Java开发手册>中,有这样的规则:超过3层的 if-else 的逻辑判断代码可以使用 ...

  9. 案例七:shell实现开机自动播放挂载本地yum仓库程序

    shell实现开机自动挂载本地YUM仓库自动化程序,可以在没有网络的情况下也可以使用yum安装程序. #!/bin/bash #自动搭建yum本地仓库 # cdrom () { mount /dev/ ...

  10. vs2022 如何让.net库文件参与程序调试【可以.net库文件的源代码中设置断点,单步跟踪】

    由于.net core 是开源的.所以可以让.net库文件参与程序调试.具体vs2022配置如下 1.设置VS2022 加载程序数据文件(.pdb俗称符号文件) 1)选择工具>选项>调试& ...