热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

详解java接口interface

详解java接口interface-引言接口这个词在生活中我们并不陌生。在中国大陆,我们可以将自己的家用电器的插头插到符合它插口的插座上;我们在戴尔,惠普,联想,苹果等品牌电

引言

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

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

我们在戴尔,惠普,联想,苹果等品牌电脑之间传输数据时,可以使用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学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文介绍了一个Java猜拳小游戏的代码,通过使用Scanner类获取用户输入的拳的数字,并随机生成计算机的拳,然后判断胜负。该游戏可以选择剪刀、石头、布三种拳,通过比较两者的拳来决定胜负。 ... [详细]
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • JavaSE笔试题-接口、抽象类、多态等问题解答
    本文解答了JavaSE笔试题中关于接口、抽象类、多态等问题。包括Math类的取整数方法、接口是否可继承、抽象类是否可实现接口、抽象类是否可继承具体类、抽象类中是否可以有静态main方法等问题。同时介绍了面向对象的特征,以及Java中实现多态的机制。 ... [详细]
  • 本文介绍了Java高并发程序设计中线程安全的概念与synchronized关键字的使用。通过一个计数器的例子,演示了多线程同时对变量进行累加操作时可能出现的问题。最终值会小于预期的原因是因为两个线程同时对变量进行写入时,其中一个线程的结果会覆盖另一个线程的结果。为了解决这个问题,可以使用synchronized关键字来保证线程安全。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • SpringBoot uri统一权限管理的实现方法及步骤详解
    本文详细介绍了SpringBoot中实现uri统一权限管理的方法,包括表结构定义、自动统计URI并自动删除脏数据、程序启动加载等步骤。通过该方法可以提高系统的安全性,实现对系统任意接口的权限拦截验证。 ... [详细]
  • 展开全部下面的代码是创建一个立方体Thisexamplescreatesanddisplaysasimplebox.#Thefirstlineloadstheinit_disp ... [详细]
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
  • 本文介绍了如何使用C#制作Java+Mysql+Tomcat环境安装程序,实现一键式安装。通过将JDK、Mysql、Tomcat三者制作成一个安装包,解决了客户在安装软件时的复杂配置和繁琐问题,便于管理软件版本和系统集成。具体步骤包括配置JDK环境变量和安装Mysql服务,其中使用了MySQL Server 5.5社区版和my.ini文件。安装方法为通过命令行将目录转到mysql的bin目录下,执行mysqld --install MySQL5命令。 ... [详细]
author-avatar
若v0丷會飛的獨角獸
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有