当前位置:

首页 > 编程开发 > Java接口的使用与原理是什么

Java接口的使用与原理是什么

何为接口?官方解释:Java内的接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能)。个人理解解释:其实接口可以理解为一种特殊的类,这个类里面全部是由全局常量和**公共的抽象方法(需要重写)所组成。接口是解决Java无法使用多继承的一种手段。我们可以把接口理解为是一个100%的抽象类,既接口中的方法必须全部是抽象方法。反正接口里面都是方法,但是没有方法体,其他类实现这个接口后重写方法体即可。为什

本文目录

    何为接口?

    官方解释:

    Java内的接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能)。

    个人理解解释:

    其实接口可以理解为一种特殊的类,这个类里面全部是由全局常量和**公共的抽象方法(需要重写)所组成。接口是解决Java无法使用多继承的一种手段。我们可以把接口理解为是一个100%的抽象类,既接口中的方法必须全部是抽象方法。反正接口里面都是方法,但是没有方法体,其他类实现这个接口后重写方法体即可。

    为什么要用接口

    • 接口被用来描述一种抽象。

    • Java可以通过实现接口来弥补一个类不能多继承的局限

    • 接口也被用来实现解耦

    • 接口被用来实现抽象,而抽象类也被用来实现抽象,为什么一定要用接口呢?接口和抽象类之间又有什么区别呢?原因是抽象类内部可能包含非final的变量,但是在接口中存在的变量一定是final,public,static的。

    接口怎么写?

    创建接口的关键字:interface

    实现接口的关键字:implements

    public interface StudentTest {   //StudentTest:接口名称
         
        public void Study();      //接口内的方法,在接口内不提供方法体。
    }
    //这就是一个简单的接口

    实现接口:

    public class student implements StudentTest{
        
        @Override
        public void Study(){
            System.out.println("我继承了StudentTest,并重写了接口内的Study方法");
        }
    }
    
    //测试类
    public class TestMain {
        public static void main(String[] args) {
            student s = new student();
            s.Study();
        }
    }

    //输出:我继承了StudentTest,并重写了接口内的Study方法

    //代码解释:
    //1、用interface创建StudentTest接口,接口内有Study方法
    //2、新建student类,用implements实现StudentTest接口
    //3、重写Study()方法
    //4、测试类测试

    注意:实现一个接口,需要重写这个接口里面的所有方法!!!!

    上述代码和解释完成了对接口的初步理解,下面我们对接口有个进一步的理解:

    进一步理解接口:

    在生活中,我们都有U盘,若要在电脑上对U盘进行读取和写入,我们需要使用USB接口。一台电脑有多个USB接口,所以我们先定义两个USB接口,并且有两个方法,分别是读取和写入:

    //第一个USB接口
    public interface USB1 {   
        public void read_1();  //读取方法
        public void write_1();  //写入方法
    }
    
    
    //第二个USB接口
    public interface USB2 {
        public void read_2();  //第二个U盘的方法
        public void write_2();
    }

    然后我们有一个U盘,因为U盘使用的是标准USB接口,所以两个USB接口我们都可以进行读取和写入,U盘类就实现了USB1和USB2两个接口,并重写了方法:

    package instance_test;
    
    public class YOUPAN implements USB1,USB2{
        @Override
        public void read_1() {
                System.out.println("这是用第一个USB的读取接口");
        };
    
        @Override
        public void write_1() {
                System.out.println("这是用第一个USB的写入接口");
        };
    
        @Override
        public void read_2() {
                System.out.println("这是用第二个USB的读取接口");
    
        };
    
        @Override
        public void write_2() {
                System.out.println("这是用第二个USB的写入接口");
            };
    
        }
    
    //意思是U盘只要符合USB接口标准,使用任意一个都可以操作方法

    然后我们开始使用两个接口:

    测试类:

    public class Test_Main {
        public static void main(String[] args) {
            YOUPAN y = new YOUPAN();
            y.read_1();
            y.write_1();
            y.read_2();
            y.write_2();
        }
    }

    结果:

    /*
    这是用第一个USB的读取接口
    这是用第一个USB的写入接口
    这是用第二个USB的读取接口
    这是用第二个USB的写入接口
    */

    然后我们现在有一部手机,有根数据线,数据线两头分别是USB和Type_C,若要用数据线对手机进行充电和更新数据,就同时要实现USB和Type_C两个接口,所以我们新建一个Type_C接口:

    public interface Type_C {     //Type_C接口
    
        public void Charge();    //充电
        public void Update();   //更新数据
    
    }

    然后新建一个手机类,有根数据线,并且实现了USB接口和Type_C接口:

    public class phone implements USB1,Type_C{   //数据线实现 USB1,Type_C接口
        
        @Override
        public void read_1() {
        	System.out.println("手机用第一个USB的接口和")
    	    //数据线使用USB接口的同时,会给一句提示语
        }
    	
    	
        @Override
        public void write_1() {
        	System.out.println("手机用第一个USB的接口和")
        }
    
        @Override
        public void Charge(){
            System.out.println("使用Type_C接口充电");
            //数据线使用Type_C接口的同时,会给一句提示语
        }
    
        @Override
        public void Update(){
            System.out.println("使用Type_C接口更新数据");
        }
    
    }

    接着测试手机类:

    public class Test_Main {
        public static void main(String[] args) {
    
            phone p = new phone();
    
            p.read_1();
            p.Charge();
            System.out.println("----------------");
            p.read_1();
            p.Update();
        }
    }

    结果:

    /*
    手机用第一个USB的接口和
    使用Type_C接口充电
    ----------------
    手机用第一个USB的接口和
    使用Type_C接口更新数据

    */

    这样一个类就实现了对多个接口的实现,恰恰解决了Java中类不能继承多个父类的局限性!!

    接口的总结:

    • 不能直接实例化接口,因为接口内方法都是抽象的,没有方法体,需重写

    • 一个类可以实现多个接口

    • 一个类如果要实现某个接口的话,那么它必须要实现这个接口中的所有方法

    • 接口中所有的方法都是抽象的和public的,所有的属性都是public、static、final的

    • 接口用来弥补类无法实现多继承的局限

    • 接口也可以用来实现解耦(关于解耦可以参考这篇文章:解耦的理解)

    • 接口也可以继承,并且可以多继承(没错,接口可以多继承!)

    public interface USB3 extends USB1,USB2{
    } //这句多继承语法是OK的

    大家看到这里,已经知道接口也是一个抽象的,那么接口和抽象类有什么区别呢?

    接口和抽象类的区别(这也是面试题,整理自互联网):

    抽象类和接口的对比:

    • 抽象类是用来捕捉子类的通用特性的。接口是抽象方法的集合。

    • 从设计层面来说,抽象类是对类的抽象,是一种模板设计,接口是行为的抽象,是一种行为的规范。

    两者的相同点:

    • 接口和抽象类都不能实例化

    • 都位于继承的顶端,用于被其他实现或继承

    • 都包含抽象方法,其子类都必须覆写这些抽象方法

    两者不同点:

    Java接口的使用与原理是什么

    备注::Java8中接口中引入默认方法和静态方法,以此来减少抽象类和接口之间 的差异。 现在,我们可以为接口提供默认实现的方法了,并且不用强制子类来实现它。 接口和抽象类各有优缺 点,在接口和抽象类的选择上,必须遵守这样一个原则:

    • 行为模型应该总是通过接口而不是抽象类定义,所以通常是优先选用接口,尽量 少用抽象类

    • 选择抽象类的时候通常是如下情况:需要定义子类的行为,又要为子类提供通用 的功能。

    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
    作者最新文章
    编程开发 Java
    相关文章 更多
    Java单元测试入门:使用JUnit 5编写第一个测试用例
    Java单元测试入门:使用JUnit 5编写第一个测试用例

    面向初学者的JUnit 5实用入门指南。从测试概念、Maven依赖配置,到手把手编写首个单元测试用例及断言验证,助你掌握Java单元测试的核心流程。

    Java变量未初始化报错解析:局部变量与成员变量默认值差异
    Java变量未初始化报错解析:局部变量与成员变量默认值差异

    深入解析Java中局部变量未初始化编译报错与成员变量自动赋予默认值的机制差异,涵盖JVM内存分配、编译期确定性赋值检查与实际排查修复方案。

    Java获取当前时间并格式化输出:DateTimeFormatter与SimpleDateFormat
    Java获取当前时间并格式化输出:DateTimeFormatter与SimpleDateFormat

    详细讲解在Java中获取当前系统时间并进行格式化输出的两种核心方案:基于Java 8全新日期时间API的DateTimeFormatter与传统遗留的SimpleDateFormat,包含完整代码示例、线程安全机制对比及生产选型建议。

    Java中final与static final常量的定义及初始化规则
    Java中final与static final常量的定义及初始化规则

    深入解析Java中final变量与static final常量的定义、内存语义、初始化时机及合法赋值路径,涵盖编译期常量优化与实战避坑指南。

    Java抽象方法与接口方法的区别及选型建议
    Java抽象方法与接口方法的区别及选型建议

    深入对比Java中抽象类抽象方法与接口方法的语法演进、设计意图及运行期差异,并提供清晰的架构选型决策流程与实战范例。

    Java实现HTTP请求与JSON解析的完整代码示例
    Java实现HTTP请求与JSON解析的完整代码示例

    本文提供Java标准库HttpClient发起HTTP GET/POST请求并结合Jackson进行JSON数据反序列化与序列化的完整代码示例与工程实践指南。

    Java递归出现StackOverflowError的原因分析及栈空间优化方案
    Java递归出现StackOverflowError的原因分析及栈空间优化方案

    详细分析Java递归调用出现StackOverflowError的原因,结合代码说明线程栈、栈帧和递归深度之间的关系,并介绍终止条件排查、迭代改写、减少栈帧开销以及通过-Xss调整JVM栈空间的方法。

    Java空指针异常(NPE)的代码排查与修复实例
    Java空指针异常(NPE)的代码排查与修复实例

    针对Java中常见的NullPointerException(NPE),本文从堆栈日志定位、典型代码触发场景、具体修复代码对比到防御体系进行系统讲解,提供实用且易上手的排查与修复方案。

    selenium上传文件教程本地文件路径设置方法
    selenium上传文件教程本地文件路径设置方法

    深入解析Selenium处理文件上传的技术细节,涵盖标准HTML控件的路径直接注入法与非标准控件的系统级模拟方案,提供Windows与Linux环境下的路径设置最佳实践及常见异常排查。

    大数据开发语言选型:Java对比Scala与Python的优缺点及适用场景
    大数据开发语言选型:Java对比Scala与Python的优缺点及适用场景

    针对大数据工程场景,系统对比Java、Scala与Python在执行性能、生态结合、开发效率和维护成本上的核心差异,给出清晰的架构选型依据与落地方案。

    查看更多
    精品专题 更多
    装机必备
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows
    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    PDF教程
    PDF教程

    正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

    Mac软件 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    Aperty macOS版
    Aperty macOS版
    macOS

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    WINDOWS 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    PixTV 网页版
    PixTV 网页版
    Windows

    PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。