【JavaSE】接口 详解(上)

news2025/1/19 3:32:44

前言

本篇会讲到Java中接口内容,概念和注意点可能比较多,需要耐心多看几遍,我尽可能的使用经典的例子帮助大家理解~

欢迎关注个人主页:逸狼


创造不易,可以点点赞吗~

如有错误,欢迎指出~



目录

前言

接口

语法

注意

 代码理解

接口运用举例

IUSB接口

KeyBoard类

Mouse类

Computer类

多个接口

代码理解(语法层面)

接口解决多继承问题 代码示例

Animal类

IFly、IRunning、ISwimming接口

Fish类

Duck类

再加上一个测试

接口间的继承

代码理解


接口

接口是公共的行为规范标准,在Java中,接口是多个类的公共规范,是一种引用数据类型

语法

  1. 定义格式与类基本相同,将class关键字换成interface关键字
  2. 接口中的成员变量(习惯上是大写)默认为public static final 修饰的(写的时候可省略public static final),必须被初始化
  3. 接口中的方法默认只能是public abstract 修饰的(也可省略不写,不写默认也是抽象方法(不能有具体的实现,否则会报错),用其他修饰符会报错)
  4. 接口中使用default修饰的方法static修饰的方法是可以有具体的实现
  5. 接口中不能有静态代码块、示例代码块构造方法
  6. 接口虽然不是类,但编译完成后也是字节码文件(后缀名是.class)。

注意

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

 代码理解

package demo2inter;

public interface ITestInterFace {
    public static final int a=100;
    int AGE=10;
    

    abstract public void fun1();
    void fun2();


    default void func(){
        System.out.println("default!");
    }
    public static void staticFunc(){
        System.out.println("staticFunc!");
    }
}

接口的简单使用

  1. 接口不能被实例化
  2. 接口需要被类实现,需要使用关键字implements来实现
  3. 当一个类实现类这个接口,那么这个类要重写这个方法
  4. 接口也可以发生向上转型、动态绑定和多态。

public interface ITestInterFace {
    void draw();

}
class Rect implements ITestInterFace{
    @Override
    public void draw() {
        System.out.println("画一个矩形!");
    }
}
class Triangle implements ITestInterFace{
    @Override
    public void draw() {
        System.out.println("画一个三角形!");
    }
}
class Test{
    public static void drawMap(ITestInterFace iTestInterFace){
        iTestInterFace.draw();
    }
    public static void main(String[] args) {
        drawMap(new Rect());//发生了向上转型和动态绑定
        drawMap(new Triangle());
    }
}

接口运用举例

请实现笔记本电脑使用USB鼠标、USB键盘的例子

  1. USB接口:包含打开设备、关闭设备功能
  2. 笔记本类:包含开机功能、关机功能、使用USB设备功能
  3. 鼠标类:实现USB接口,并具备点击功能
  4. 键盘类:实现USB接口,并具备输入功能

在包demo3中,创建3个类,一个接口

IUSB接口

package demo3;

public interface IUSB {
    // USB接口
    void openDevice();//打开服务
    void closeDevice();//关闭服务

}

KeyBoard类

package demo3;


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("键盘输入!");
    }
}

Mouse类

package demo3;

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("点击鼠标!");
    }
}

Computer类

package demo3;

import demo2inter.ITestInterFace;

public class Computer {
    public void powerOff (){
        System.out.println("关闭电脑!");
    }
    public void powerOn(){
        System.out.println("打开电脑!");
    }
    public void useDevice(IUSB usb){
        usb.openDevice();
        //这里要区分 USB引用了哪个对象
        if(usb instanceof Mouse){
            Mouse mouse =(Mouse) usb;//向下转型
            mouse.click();
        }

        //调用键盘
        if(usb instanceof KeyBoard){
            KeyBoard keyBoard=(KeyBoard) usb;
            keyBoard.input();
        }

        usb.closeDevice();
    }

    public static void main(String[] args) {
        Computer computer=new Computer();
        computer.powerOn();


        computer.useDevice(new KeyBoard());//向上转型
        computer.useDevice(new Mouse());
        computer.powerOff();

    }
}

多个接口

Java中不支持多继承,但是一个类可以实现多个接 口。接口表达含义是 具有**特性,可以帮助程序员忘掉类型,只关注特性。

代码理解(语法层面)

类TestDemo4实现了IA和IB接口

package demo4;

//多个接口
interface IA{
    void testA();
}
interface IB{
    void testB();
}
class TestDemo4 implements IA,IB{

    @Override
    public void testA() {
        System.out.println("testA()");
    }

    @Override
    public void testB() {
        System.out.println("testB()");
    }
}
public class Test4 {
    public static void main(String[] args) {
        TestDemo4 testDemo4=new TestDemo4();
        testDemo4.testA();
        testDemo4.testB();
    }

}

接口解决多继承问题 代码示例

在demomoreinher包中有Animal抽象类,Duck,Fish类 以及IFly、IRunning、ISwimming接口

Animal类

IFly、IRunning、ISwimming等动物特性应该采用接口方式

package demomoreinher;

public abstract class Animal {
    protected String name;
    protected int age;

    public Animal(String name, int age) {
        this.name = name;
        this.age = age;
    }
    public abstract void eat();
    //像跑 游泳 飞等动作不能写在这里,因为不是所有动物都会这些技能  应该写在接口中
}

IFly、IRunning、ISwimming接口

//注意:这里的代码是在不同IFly、IRunning、ISwimming接口文件中的
public interface IFly {
    void fly();
}


public interface IRunning {
    void run();
}


public interface ISwimming {
    void swim();
}

Fish类

鱼只会游泳这项特性,所以接口ISwimming

package demomoreinher;

public class Fish extends Animal implements ISwimming{//如果这里游泳写出类,java是不支持多继承的,所有说接口解决了多继承问题
    public Fish(String name, int age) {
        super(name, age);
    }

    @Override
    public void eat() {
        System.out.println(this.name+"吃鱼粮!");
    }

    @Override
    public void swim() {
        System.out.println(this.name+"游泳~");
    }
}

Duck类

而鸭子游泳,跑,飞这3个技能都会,所以三个特性都接上

package demomoreinher;

public class Duck extends Animal implements ISwimming,IFly,IRunning{
    public Duck(String name, int age) {
        super(name, age);
    }

    @Override
    public void eat() {
        System.out.println(this.name+"吃鸭粮!");
    }

    @Override
    public void fly() {
        System.out.println(this.name+"飞~~~");
    }

    @Override
    public void run() {
        System.out.println(this.name+"跑~~~");
    }

    @Override
    public void swim() {
        System.out.println(this.name+"游泳~~~");
    }
}

再加上一个测试

package demomoreinher;

public class TestAnimal {
    public static void eatFunc(Animal animal){
        animal.eat();//实现eat的动态绑定
    }
    public static void walk(IRunning running){
        running.run();//实现跑的动态绑定
    }

    public static void main(String[] args) {
        walk(new Duck("唐老鸭",3));

        eatFunc(new Fish("灵儿",2));
    }
}

测试结果

接口间的继承

相当于将接口合并在一起了

代码理解

IC继承了IA和IB,使IC接口的功能包含了IA和IB的功能,当然类TestDeme在实现接口IC时,要将IA,IB和IC的方法一起都要重写

package demo5;

//接口继承问题
interface IA{
    void testA();
}
interface IB{
    void testB();
}
//IC接口不仅具备了自己的testC这个功能,还 扩展 了IA和IB的功能
interface IC extends IA,IB{
    void testC();

}
class TestDemo implements IC{

    @Override
    public void testA() {
        System.out.println("testA()");
    }

    @Override
    public void testB() {
        System.out.println("testB()");
    }

    @Override
    public void testC() {
        System.out.println("testC()");
    }
}

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

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

相关文章

YoloV8改进策略:BiFPN+小目标分支实现小目标检测精度的大幅度上升

摘要 这几天有粉丝提到了BiFPN解决小目标问题,我结合我的经验,将BiFPN和小目标分支结合实现小目标任务检测精度的上升。 BiFPN 论文:https://arxiv.org/pdf/1911.09070v2.pdf BiFPN,全称Bi-directional Feature Pyramid Netwo…

leetcode.24. 两两交换链表中的节点

题目 给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。 思路 创建虚拟头节点,画图,确认步骤。 实现 /*** Definition for singly-li…

阿德勒、荣格、埃里克森、霍妮、弗洛姆、沙利文的新精神分析理论

新精神分析理论,强调自我的自主性及其整合与调节功能,强调文化和社会因素对人格的重大影响。 一、阿德勒的个体心理学 阿德勒,是一个男人努力克服自卑感的优秀样板。阿德勒写了《超越与自卑》。 阿德勒,向意识层面扩展精神分析…

SpringBoot快速入门笔记(4)

文章目录 一、Vue框架1、前端环境准备2、简介3、快速开始4、事件绑定 二、Vue组件化开发1、NPM2、Vue Cli3、组件化开发4、SayHello自定义组件5、Movie自定义组件 一、Vue框架 1、前端环境准备 编码工具:VSCode 依赖管理:NPM 项目构建:VueCl…

【Mathematical Model】基于Python实现随机森林回归算法特征重要性评估线性拟合

前段时间在做遥感的定量反演,所以研究了一下回归算法,由于之前发的几篇博文都是定义好基础方程进行拟合的,不太满足我的需求。所以研究了一下随机森林回归的算法,之前使用随机森林都是做分类,这次做了回归算法也算是补…

Elasticsearch:我们如何演化处理二进制文档格式

作者:来自 Elastic Sean Story 从二进制文件中提取内容是一个常见的用例。一些 PDF 文件可能非常庞大 — 考虑到几 GB 甚至更多。Elastic 在处理此类文档方面已经取得了长足的进步,今天,我们很高兴地介绍我们的新工具 —— 数据提取服务&…

java-权限修饰符、代码块

一、权限修饰符概念 权限修饰符是用来控制一个成员被访问的范围,可以用来修饰成员变量、方法、构造方法、内部类 二、权限修饰符的分类 举例: 1、private 2、空着不写 3、protected 4、public 三、权限修饰符的使用规则 实际开发中,一般使…

SSM框架学习——了解MyBatis

了解MyBatis 什么是MyBatis MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO&#xff…

Linux第4课 Linux的基本操作

文章目录 Linux第4课 Linux的基本操作一、图形界面介绍二、终端界面介绍 Linux第4课 Linux的基本操作 一、图形界面介绍 本节以Ubuntu系统的GUI为例进行说明,Linux其他版本可自行网搜。 图形系统进入后,左侧黄框内为菜单栏,右侧为桌面&…

LeetCode-131. 分割回文串【字符串 动态规划 回溯】

LeetCode-131. 分割回文串【字符串 动态规划 回溯】 题目描述:解题思路一:回溯, 回溯三部曲解题思路二:0解题思路三:0 题目描述: 给你一个字符串 s,请你将 s 分割成一些子串,使每个…

【JSON2WEB】 12基于Amis-admin的动态导航菜单树

【JSON2WEB】01 WEB管理信息系统架构设计 【JSON2WEB】02 JSON2WEB初步UI设计 【JSON2WEB】03 go的模板包html/template的使用 【JSON2WEB】04 amis低代码前端框架介绍 【JSON2WEB】05 前端开发三件套 HTML CSS JavaScript 速成 【JSON2WEB】06 JSON2WEB前端框架搭建 【J…

Visual Studio安装下载进度为零已解决

因为在安装pytorch3d0.3.0时遇到问题,提示没有cl.exe,VS的C编译组件,可以添加组件也可以重装VS。查了下2019版比2022问题少,选择了安装2019版,下面是下载安装时遇到的问题记录,关于下载进度为零网上有三类解…

Redis-底层数据结构

Redis-底层数据结构 redisObject对象机制对象共享引用计数以及对象的消毁 动态字符串SDS链表链表的优缺点: 压缩链表ziplist的缺点 字典-Dictrehash渐进式rehash 整数集-intSet内存分布图整数集合的升级 跳表 - ZSkipList快表-quicklistlistpack redisObject对象机制 typedef s…

HFSS仿真环形耦合器学习笔记

HFSS仿真环形耦合器学习笔记 文章目录 HFSS仿真环形耦合器学习笔记1、 理论基础2、 设计分析3、 仿真验证1、 求解器设置2、 建模3、 激励方式设置4、 边界条件设置5、 扫频设置6、 设计检查,仿真分析7、 数据后处理 1、 理论基础 环形定向耦合器的结构示意图如图所…

Android 关于apk反编译d2j-dex2jar classes.dex失败的几种方法

目录 确认路径正确直接定位到指定目录确定目录正确,按如下路径修改下面是未找到相关文件正确操作 确认路径正确 ,即d2j-dex2jar和classes.dex是否都在一个文件夹里(大部分的情况都是路径不正确) 直接定位到指定目录 路径正确的…

Linux 安装系统可视化监控工具 Netdata

目录 About 监控工具 NetdataLinux 系统安装 Netdata关于 openEuler1、查看内核信息2、查看主机信息3、查看 dnf 包管理器的版本 Netdata 安装1、更新系统环境相关 rpm 包2、查看 netdata 包信息3、安装 netdata 包4、编辑 netdata.conf 配置5、启动 netdata 服务6、查看 netda…

深入浅出 -- 系统架构之微服务架构常见的六种设计模式

面向服务的架构(SOA) 面向服务的架构(SOA)是一种设计方法,也是一个组件模型,它将应用程序的不同功能单元(称为服务)通过这些服务之间定义良好的接口和契约联系起来。接口是采用中立的…

JAVA毕业设计132—基于Java+Springboot+Vue的自习室座位预约小程序管理系统(源代码+数据库)

毕设所有选题: https://blog.csdn.net/2303_76227485/article/details/131104075 基于JavaSpringbootVue的自习室座位预约小程序管理系统(源代码数据库)132 一、系统介绍 本项目前后端分离带小程序,分为管理员、用户两种角色 1、用户: 注…

数学与人工智能:共舞于数字时代的奥秘

数学,这一源远流长的学科,长久以来一直为人类社会的发展与进步提供了坚实的基础。与此同时,随着科技的迅猛发展,人工智能这一新兴领域正逐渐改变着我们的生活方式。这两者之间,似乎存在着一种难以言喻的紧密联系。本文…

苍穹外卖——项目搭建

一、项目介绍以及环境搭建 1.苍穹外卖项目介绍 1.1项目介绍 本项目(苍穹外卖)是专门为餐饮企业(餐厅、饭店)定制的一款软件产品,包括 系统管理后台 和 小程序端应用 两部分。其中系统管理后台主要提供给餐饮企业内部员…