Java接口

news2025/8/6 4:11:32
  1. 什么是接口?
    在Java中,接口可以看成是多个类的公共规范,是一种引用数据类型。

  2. 使用关键字interface来定义接口

interface IRunning {
    void run();
}

在创建接口时,接口的命名一般以大写字母I开头,接口的命名一般使用形容词词性的单词。【阿里编码规范中约定,接口中的方法和属性不要加任何修饰符号,保持代码的简洁性。】

  1. 接口不能被实例化
    在这里插入图片描述

  2. 接口当中的成员默认是public static final (静态常量)

    public String name = "小王";
    public static String name2 = "小王";
    public static final String name3 = "小王";

name为斜体,因为一个变量如果被static修饰,则变量名就变成斜体了,而且静态常量必须赋初始值,否则会报错。

  1. 接口当中的方法不写也是默认为public abstract,而且只能是public abstract,其他修饰符都会报错在这里插入图片描述
  2. 接口当中的方法不能由具体的实现,但是从jdk8开始可以写一个default修饰的具体实现的方法
    在这里插入图片描述
  3. 接口当中不能有构造方法,因为成员变量都是static final的,所有定义的变量一定是已经赋值的。
    在这里插入图片描述
  4. 接口需要被类实现,使用关键字implements
interface IRunning {
    void run();
}

public class Test implements IRunning {
    @Override
    public void run() {
        System.out.println("实现接口中的run方法");
    }
}
  1. 接口当中可以有static修饰的方法
interface IRunning {
    void run();
    public static void func() {
        System.out.println("接口中static方法");
    }
}

总结:接口中可以有3种方法,2种比较特殊(default修饰的方法,static修饰的方法)

  1. 接口不能直接使用,必须要有一个“实现类”,实现接口中的所有抽象方法
    【注意:子类和父类之间是extends继承关系,类和接口之间是implements实现关系】

  2. 实现笔记本电脑使用USB鼠标、USB键盘的例子
    ①USB接口:包含打开设备、关闭设备功能
    ②鼠标类:实现USB接口,并具备点击功能
    ③键盘类:实现USB接口,并具备输入功能
    ④笔记本类:包含开机功能、关机功能,使用USB设备功能

package demo;
//Usb接口:包含打开设备、关闭设备功能
public interface IUSB {
    void openDevice();
    void closeDevice();
}

package demo;

public class KeyBoard implements IUSB{
    @Override
    public void openDevice() {
        System.out.println("打开键盘");
    }

    @Override
    public void closeDevice() {
        System.out.println("关闭键盘");
    }

    public void inPut(){
        System.out.println("键盘输入");
    }
}

package demo;

public class Mouse implements IUSB{
    @Override
    public void openDevice() {
        System.out.println("打开鼠标");
    }

    @Override
    public void closeDevice() {
        System.out.println("关闭鼠标");
    }

    public void click() {
        System.out.println("鼠标点击");
    }
}

package demo;

public class Computer {
    public void open() {
        System.out.println("打开电脑");
    }

    public void close() {
        System.out.println("关闭电脑");
    }

    public void func(IUSB iusb) {
        iusb.openDevice();
        if (iusb instanceof KeyBoard) {
            ((KeyBoard) iusb).inPut();
        }else if (iusb instanceof Mouse) {
            ((Mouse) iusb).click();
        }
        iusb.closeDevice();
    }
}

package demo;

public class Test {
    public static void main(String[] args) {
        Computer computer = new Computer();
        computer.func(new Mouse());
        System.out.println("=========");
        computer.func(new KeyBoard());
    }
}

运行结果:
在这里插入图片描述
分析:在func方法中,发生了向上转型,传入的是接口类型,站在这个角度,我们就可以不关心usb这个引用到底引用了哪个对象,只要实现了这个接口的规范就可以传进来。
动态绑定和多态:从代码的角度,可以省略代码,而且还融入了设计的思想。

  1. 重写接口中方法时,不能使用默认的访问权限
    因为子类重写方法的权限要大于等于父类,接口(父类)中方法都是public abstract的,所以子类重写的权限只能时public的
    在这里插入图片描述
  2. 实现多个接口
    在java中,类和类之间是单继承的,一个类只能有一个父类【不支持多继承】,但是在Java中一个类可以实现多个接口
    例子:结合抽象类和接口实现动物类,狗类,鱼类,鸭类等。
    整体代码:定义跑、游、飞的接口;定义动物类,狗类,鱼类,鸭类;并在Test类当中测试。
    在上述基础上,定义机器人类【有了接口之后,类的使用者就不必关注具体类型,让程序员忘记类型】,机器人类实现跑的接口,因此实例化机器人对象可以调用walk1方法,即使机器人不是动物类。

接口:会跑的、会游的、会飞的

package demo1;

public interface IRunning {
    void run();
}

package demo1;

public interface ISwimming {
    void swim();
}


package demo1;

public interface IFly {
    void fly();
}

动物类:设计被抽象类

package demo1;

public abstract class Animal {
    public String name;

    public Animal(String name) {
        this.name = name;
    }
}

狗类:狗是一个动物,具备running这样的一个功能

package demo1;

public class Dog extends Animal implements IRunning{
    @Override
    public void run() {
        System.out.println(name + "用四条狗腿在跑");
    }

    public Dog(String name){
        super(name);
    }

}

鱼类:鱼是一个动物,具备swimming这样的一个功能

package demo1;

public class Fish extends Animal implements ISwimming{
    @Override
    public void swim() {
        System.out.println(name + "在水里游游游");
    }

    public Fish(String name) {
        super(name);
    }
}

鸭类:鸭是一个动物,具备running、swimming以及flying3个功能【实现多个接口】

package demo1;

public class Duck extends Animal implements IRunning, ISwimming, IFly{
    @Override
    public void fly() {
        System.out.println(name + "在天上飞飞飞");
    }

    @Override
    public void run() {
        System.out.println(name + "在地上跑跑跑");
    }

    @Override
    public void swim() {
        System.out.println(name + "在水里游游游");
    }

    public Duck(String name) {
        super(name);
    }
}

机器人类:机器人有running这样的功能,但是机器人不是动物类。【因为接口让程序员忘记类型】

package demo1;

public class Robat implements IRunning{
    private String name;
    @Override
    public void run() {
        System.out.println(name + "用机器腿在跑");
    }

    public Robat(String name) {
        this.name = name;
    }
}

测试类:

package demo1;

public class Test {

    public static void walk1(IRunning iRunning) {
        iRunning.run();
    }

    public static void walk2(ISwimming iSwimming) {
        iSwimming.swim();
    }

    public static void walk3(IFly iFly) {
        iFly.fly();
    }



    public static void main(String[] args) {
        Dog dog = new Dog("旺财");
        walk1(dog);
        System.out.println("===========");
        Fish fish = new Fish("小鱼儿");
        walk2(fish);
        System.out.println("===========");
        Duck duck = new Duck("唐老鸭");
        walk1(duck);
        walk2(duck);
        walk3(duck);
        System.out.println("===========");
        Robat robat = new Robat("小王");
        walk1(robat);
    }
}

运行结果:
在这里插入图片描述
分析:在walk方法内部,我们并不关注到底是哪种动物,只要参数是会跑的就行,甚至参数可以不是“动物”,比如机器人,只要会跑,总而言之接口让我们忘记了类型,只要实现了这个接口就可以传。

  1. 接口之间的继承
    在Java中,类和类之间是单继承的,但是一个类可以实现多个接口,并且接口和接口之间可以多继承【接口的扩展】。
package demo1;

public interface IRunAndSwim extends IRunning, ISwimming{
}

此时如果类要实现 IRunAndSwim 接口,则不仅要实现run方法,也要是心啊swim方法。
接口间的继承相当于把多个接口合并在一起。

  1. 总结
    类可以继承一个普通类
    类可以继承一个抽象类
    类可以继承一个普通类/抽象类,同时实现多个接口
    接口可以扩展多个接口

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/15780.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【数据结构】栈和队列

文章目录栈和队列栈栈的概念及结构栈的实现初始化栈入栈出栈获取栈顶元素获取栈中有效元素个数判断栈是否为空销毁栈括号匹配问题队列队列的概念及结构队列的实现初始化队列队尾入队列对头出队列获取队头元素获取队尾元素销毁队列判断队列是否为空栈和队列 栈 栈的概念及结构…

带你初识微服务

博客主页:踏风彡的博客 博主介绍:一枚在学习的大学生,希望在这里和各位一起学习。 所属专栏:SpringCloud 文章创作不易,期待各位朋友的互动,有什么学习问题都可在评论区留言或者私信我,我会尽我…

同花顺_代码解析_技术指标_L

本文通过对同花顺中现成代码进行解析,用以了解同花顺相关策略设计的思想 目录 LH_LYDG LH_猎鹰歼狐 LHBLX LHSJ LHTZ LHXJ LH猎狐雷达 LOF净值 LWR LH_LYDG 猎鹰渡关(检测大盘顶部) 指标用法: (1&#xff…

进程间的信号

目录 一.信号入门 1.1概念 1.2信号发送与记录 1.3信号的处理方式 二.产生信号的方式 2.1通过终端按键产生 2.2通过系统函数向进程发信号 2.3由软件条件产生信号 2.4由硬件异常产生信号 三.阻塞信号 3.1信号相关概念 3.2信号在内核的表示 3.3sigset_t: 3.4…

工具及方法 - 使用Total Commander来查找重名文件

我只是一个Total Commander的轻度使用者,主要使用的是打开多个窗口,可以方便的以标签形式切换。 还有,这个软件是免费的,只是免费版打开时多一步,要输入个数字验证。 今天在使用一个SDK时,要包含进很多头文…

论文阅读笔记《Locality Preserving Matching》

核心思想 该文提出一种基于局部保持的特征匹配方法(LPM)。其核心思想是对于一个正确匹配点,其邻域范围内的其他匹配点与对应目标点之间的变换关系,应该和正确的匹配点保持一致,而错误匹配点,则应该有较大的…

第一章《初学者问题大集合》第6节:IntelliJ IDEA的下载与安装

当完成了Java开发环境之后,各位读者就可以开始编写第一个Java程序了。可是应该在哪里写程序呢?早期的开发者们都是用纯文本编辑工具编写Java程序,并且在命令行窗口中编译和运行Java程序。时至今日,我们早已远离了那个程序开发的“…

CentOs程序环境准备

1. MySQL的安装启动 选择指定操作系统指定版本的mysql进行下载 MySQL :: Download MySQL Community Serverhttps://dev.mysql.com/downloads/mysql/5.7.html#downloads 选择复制下载链接 回到终端,执行此命令下载 wget https://dev.mysql.com/get/Downloads/MyS…

举个栗子~Tableau 技巧(244):用和弦图(Chord diagram)呈现数据关系

关于和弦图 和弦图(Chord diagram)常用来表示数据之间的相互关系。数据点沿着圆圈分布,通过点和点之间相互连接的弧线来呈现相互之间的关系。和弦图从视觉上来说比较美观,数据呈现又很直观,所以深受数据粉喜爱。 之前…

【Linux初阶】Linux调试器-gdb使用 | gdb的 l/b/info/d/r/n/s/bt/finish/p/(un)display/q

🌟hello,各位读者大大们你们好呀🌟 🍭🍭系列专栏:【Linux初阶】 ✒️✒️本篇内容:gdb使用相关背景知识,gdb的使用(打断点、查断点、消断点、调试运行、查看对应变量&…

【python拼图游戏】图片自选,来挑战一下自己的极限吧~

嗨害大家好鸭!我是小熊猫❤ 拼图的画面多以自然风光、建筑物以及一些为人所熟识的图案的为题材。 城堡和山峦是两类传统的主题, 不过任何图画和影像都可以用做拼图的素材。 有一些公司还提供将私人摄影作品制成拼图的服务。 今天我小熊猫就给带来py…

FFmpeg5.1 解码rtsp 并用OpenCV 播放

RTSP 连接过程如下图 看下实际过程中FFmpeg 的日志情况: [tcp 0000014CC3256D40] No default whitelist set [tcp 0000014CC3256D40] Original list of addresses: [tcp 0000014CC3256D40] Address ::1 port 8554 [tcp 0000014CC3256D40] Address 127.0.0.1 po…

使用BP神经网络、RBF神经网络以及PSO优化的RBF神经网络对数据进行预测(Matlab代码实现)

🍒🍒🍒欢迎关注🌈🌈🌈 📝个人主页:我爱Matlab 👍点赞➕评论➕收藏 养成习惯(一键三连)🌻🌻🌻 🍌希…

Keysight是德科技E5061B网络分析仪-安泰测试

E5061B ENA系列网络分析仪从5Hz 至3GHz提供了广泛的频率范围。它不仅支持一般的射频应用(例如滤波器或放大器测量等),还支持低频应用(例如直流至直流转换器环路增益测量)。因此,它是所有实验台上进行网络分析的最重要工具。 拥有E5061B,您就…

Selenium4 新特性

一、Selenium4 简介 Selenium是一个综合性项目,包含一系列的工具和库,支持Web浏览器的各种自动化操作: 软件测试爬虫领域RPA领域优点: 开源:https://github.com/SeleniumHQ兼容性: Chrome、FireFox、Edeg、IE、Opera、Safari支持多种编程语言:Java、Python、C#、Ruby、…

Charles抓包web、手机、小程序配置

一、下载地址 二、web抓包 Charles Web抓包,启动Charles会自动与浏览器设置成代理,不需要进行过多的设置。接下来就是通过浏览器发送网络请求,Charles就会直接抓取到这些信息和响应信息。 1、抓取HTTPS协议 Charles配置 点击顶部菜单栏【He…

双功能螯合剂p-NCS-Bz-DFO,1222468-90-7,p-SCN-Bn-Deferoxamine特点分析

●外观以及性质: p-SCN-Bn-Deferoxamine属于双功能螯合剂,西安凯新生物科技有限公司是各种修饰性PEG供应商,提供各种品质优良PEG衍生物,分子量从1000-40000不等,纯度≥95%,发货速度快。 ●中文名&#xff…

Web学习笔记-React

笔记内容转载自AcWing的Web应用课讲义,课程链接:AcWing Web应用课。 CONTENTS1. React配置环境2. ES6语法补充3. Components1. React配置环境 React官网:React。 React是一个声明式,高效且灵活的用于构建用户界面的JavaScript库…

凡事预则立,不预则缺货!2022年底了核芯物联蓝牙AOA定位基站GA25缺货!GA10缺货!GA60也缺货!

凡事预则立,不预则缺货!2022年底了核芯物联蓝牙AOA定位基站GA25缺货!GA10缺货!GA60也缺货! 核芯物联岳毅恒 ​ 深圳核芯物联科技有限公司 战略合作拓展总监 凡事预则立,不预则缺货!202222年底…

brython | 初探鼠标事件-1:点击事件

各位前端大佬勿笑话,运维小弟献丑了。 前段时间看见大佬使用【文言文】写了一个连连看,于是我也想用【brython】也实现一个连连看。 于是乎,你们就看到这篇文章和这个项目了。 如果大佬们对brython不是特别了解的话,建议先查看之…