详解java接口interface

详解java接口interface引言接口这个词在生活中我们并不陌生。在中国大陆,我们可以将自己的家用电器的插头插到符合它插口的插座上;我们在戴尔,惠普,联想,苹果等品牌电脑之间传输数据时,可以使用U盘进行传输。插座的普适性是

大家好,又见面了,我是你们的朋友全栈君。

引言

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

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

我们在戴尔,惠普,联想,苹果等品牌电脑之间传输数据时,可以使用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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/155384.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Lighttpd 配置fastcgi

    Lighttpd 配置fastcgihttp://my.oschina.net/davehe/blog/108107        在配置之前,先了解下lighttpd和fastcgi.            Lighttpd相信大家都使用过,它是一个具有非常低的内存开销,cpu占用率低,效能好,以及丰富的模块等特点。lighttpd是众多OpenSource轻量级的webserver中较为优秀的一个

    2022年7月27日
    4
  • hash校验软件_hash加密

    hash校验软件_hash加密【Hash篇】HashTab一款可扩展资源管理器的哈希校验软件​ HashTab是一款非常优秀的Windows资源管理器扩展程序,它在资源管理器的属性窗口中添加了”文件校验”的标签,可以非常方便地校验文件的CRC32、MD5、SHA1等校验值,另外还可以迅速与其他文件进行哈希值比对!—【suy】文章目录【Hash篇】HashTab一款可扩展资源管理器的哈希校验软件1、自定义哈希算法2、文件比较功能3、下载地址总结1、自定义哈希算法​ HashTab可计算和显示来自二十多种流行的哈希算法的哈希值,

    2022年9月12日
    0
  • 什么是PMF?

    什么是PMF?PMF是ProductMarketFit的简写,是指产品和市场达到最佳的契合点,你所提供的产品正好满足市场的需求,令客户满意,这是创业成功的第一步。PMF如何实现PMF金字塔模型PMF金字塔模型“PMF金字塔模型”是一个可操作的模型,它用5个关键要素定义了PMF的问题。在这个层级模型中,每一个要素就是金字塔的一层,并且直接与它上下层相关联。从下到上,这5层依次是:你的目标用户,你用户未被满足的需求,你的价值主张,产品的功能集,你的用户体验(UX)。精益产品开发流程是建立在P.

    2022年5月10日
    94
  • charles打断点有什么用_charles打断点后 如何执行

    charles打断点有什么用_charles打断点后 如何执行前言Charles是收费软件,可以免费试用30天。试用期过后,未付费的用户仍然可以继续使用,但是每次使用时间不能超过30分钟,并且启动时将会有10秒种的延时。此时,我们只需网上找一个注册码即可解

    2022年7月30日
    3
  • 海量数据存储技术与解决方案[通俗易懂]

    海量数据存储难点:数据量过大,数据中什么情况都可能存在;软硬件要求高,系统资源占用率高;要求很高的处理方法和技巧。海量数据存储处理经验:一、选用优秀的数据库工具    现在的数据库工具厂家比较多,对海量数据的处理对所使用的数据库工具要求比较高,一般使用Oracle或者DB2,微软公司最近发布的SQLServer2005性能也不错。另外在BI领域:数据库,数据仓库,多维数据库,数据挖

    2022年4月14日
    52
  • Android SDK下载和环境变量配置

    Android SDK下载和环境变量配置一.AndroidSDK简介AndroidSDK(SoftwareDevelopmentKit,软件开发工具包)被软件开发工程师用于为特定的软件包、软件框架、硬件平台、操作系统等建立应用软件的开发工具的集合。它提供了AndroidAPI库和开发工具构建,测试和调试应用程序。简单来讲,AndroidSDK可以看做用于开发和运行Android应用的一个软件。二.AndroidSDK下载1.国内的Android工具的下载网站:https://www.androiddevtools.

    2022年7月19日
    11

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号