3.3 接口

news2024/12/25 10:18:51

文章目录

  • 1.接口的概念
  • 2.接口格式
  • 3.接口的特点
    • 3.1 练习-1:创建接口
    • 3.2 练习-2:创建接口实现类
    • 3.3 练习-3:创建接口测试类
  • 4.接口的用法
  • 5.接口的多继承多实现
  • 6.接口总结
    • 6.1 类与类的关系
    • 6.2 类与接口的关系
    • 6.3 接口与接口的关系
    • 6.4 抽象类与接口的区别


1.接口的概念

与之前学习过的抽象类一样,接口( Interface )在Java中也是一种抽象类型,接口中的内容是抽象形成的需要实现的功能,接口更像是一种规则和一套标准.

2.接口格式

interface 接口名{代码...}

3.接口的特点

  1. 通过interface关键字来定义接口
  2. 通过implements让子类来实现接口
  3. 接口中的方法全部都是抽象方法(JAVA8)
  4. 可以把接口理解成一个特殊的抽象类(但接口不是类!!!)
  5. 类描述的是一类事物的属性和方法,接口则是包含实现类要实现的方法
  6. 接口突破了java单继承的局限性
  7. 接口和类之间可以多实现,接口与接口之间可以多继承
  8. 接口是对外暴露的规则,是一套开发规范
  9. 接口提高了程序的功能拓展,降低了耦合性
    请添加图片描述

3.1 练习-1:创建接口

package partTwo;
/* 本接口用于接口的入门案例1
 * 1.我们通过interface关键字来定义接口*/
public interface Inter {
    //2.接口里可以有普通方法吗?  不可以
    // public void eat(){}

    //3.接口里可以有抽象方法吗?  可以,接口中的方法都是抽象方法
    public abstract void eat();
    public abstract void play();
}

3.2 练习-2:创建接口实现类

package partTwo;
/* 本类用于接口的实现类
 * 1.我们通过implements建立实现类与接口的实现关系
 * 2.实现类与接口建立了实现关系以后,有俩种方案
 * 方案一:不实现或实现部分接口中的抽象方法,作为抽象子类:;
 * 方案二:实现父接口中的所有的抽象方法,作为普通子类;*/
// 方案一:abstract public class InterImpl implements inter{}


// 方案二
public class InterImpl implements Inter{
    @Override
    public void eat() {
        System.out.println("下雨天和火锅更配");
    }

    @Override
    public void play() {//作为标记,标记实现了父接口的抽象方法
        System.out.println("玩啥玩,我爱敲代码");
    }
}
  1. 我们通过implements建立实现类与接口的实现关系
  2. 实现类与接口建立了实现关系以后,有俩种方案
    • 方案一:不实现或实现部分接口中的抽象方法,作为抽象子类:
    • 方案二:实现父接口中的所有的抽象方法,作为普通子类;

3.3 练习-3:创建接口测试类

package partTwo;

public interface TestInterImpl {
    public static void main(String[] args) {
        /* 接口可以创建对象吗?  不可以*/
        //Inter i = new Inter();

        /* 创建多态对象进行测试*/
        Inter i = new InterImpl();
        i.eat();
        i.play();

        /* 创建纯纯的子类对象进行测试*/
        InterImpl i2 = new InterImpl();
        i2.eat();
        i2.play();
    }
}

4.接口的用法

package partTwo;
/* 创建一个interface接口,用于进一步测试接口的使用*/
public interface Inter2 {
    /* 1.接口中是否有构造方法---没有*/
    //public Inter2(){}

    /* 2.接口中是否有成员变量---没有
     * 接口中的变量,实际上是静态常量
     * 静态:可以被接口名直接调用
     * 常量:值不可以被修改,并且定义时必须赋值
     * 所以,接口会默认给每个变量自动拼接public static final
     * 完整格式:public static final int age = 10;  */
    int age = 10;    //实际上是静态常量,不是成员变量

    /* 3.接口中有抽象方法吗   有
     * 而且会给方法自动拼接 public abstract,我们写方法时可以简写*/
    public abstract void play();
    void eat();
}
  1. :接口里是没有构造方法的

    • 在创建实现类的对象时默认的super(),是调用的默认Object的无参构造
    • 如果一个类没有明确指定自己的父类,那么这个类默认继承顶级父类Object
    • 所以,虽然接口中没有构造方法,但是并不影响实现类构造函数中的super()
    • 因为这个构造方法是object的,与接口无关
  2. 接口中是否有成员变量—没有

    • 接口中的变量,实际上是静态常量
    • 静态:可以被接口名直接调用
    • 常量:值不可以被修改,并且定义时必须赋值
    • 所以,接口会默认给每个变量自动拼接public static final
    • 完整格式:public static final int age = 10;
  3. 接口中有抽象方法吗 有

    • 而且会给方法自动拼接 public abstract,我们写方法时可以简写
package partTwo;

/* 本类用作Inter2接口的实现类*/
//public class Inter2Impl extends Object implements Inter2{
public class Inter2Impl implements Inter2{
    //1.创建接口实现类的构造方法
    public  Inter2Impl(){
        /*如果一个类没有明确指定自己的父类,那么这个类默认继承顶级父类Object
         * 所以,虽然接口中没有构造方法,但是并不影响实现类构造函数中的super()
         * 因为这个构造方法是object的,与接口无关*/
        super();//表示调用父类的无参构造
        System.out.println("我是接口实现类的无参构造");
    }
    //如果接口中添加了抽象方法,那么实现类中要实现所有所有未实现的实现方法
    @Override
    public void play() {
        System.out.println("玩一玩");
    }

    @Override
    public void eat() {
        System.out.println("吃一吃");
    }
}
  1. 如果一个类没有明确指定自己的父类,那么这个类默认继承顶级父类Object
    * 所以,虽然接口中没有构造方法,但是并不影响实现类构造函数中的super()
    * 因为这个构造方法是object的,与接口无关

  2. 如果接口中添加了抽象方法,那么实现类中要实现所有所有未实现的实现方法

package partTwo;
/* 本类用作Inter2接口的实现类的测试类*/
public class TestInterImpl2 {
    //1.创建测试类中的入口函数main
    public static void main(String[] args) {
        //2.创建接口实现类的对象
        Inter2Impl i = new Inter2Impl();
        System.out.println(i.age);
        //3.可以被接口直接调用,证明是静态的
        System.out.println(Inter2.age);
        //值不可以被修改,证明是final
        //Inter2.age = 100;

        i.eat();
        i.play();
    }
}
  1. 我们通过interface关键字定义接口
  2. 接口实现类需要通过关键字implements与接口建立实现关系
  3. 接口不可以创建对象/实例化
  4. 在java8中,接口中所有的方法都是抽象方法,方法可以简写,会自动拼接public abstract
  5. 接口中没有构造方法,接口实现调用的构造方法是父类的,不是父接口的
    注意:如果一个类没有明确指定父类的话,会默认继承顶级父类object
  6. 接口中没有成员变量,都是静态常量,默认会拼接public static final
  7. 接口不是类!!!你可以把接口理解成一个特殊的抽象类,特殊在,所有的方法都是抽象方法
  8. 如果一个实现类实现了接口,要不变成一个抽象子类,【不实现/实现部分】,要不变成一个普通子类【全部实现】
  9. 接口用来指定规则的【有哪些方法,方法有参数吗?有返回值类型吗?】并不做具体的实现
  10. 接口可以多继承【一个接口可以继承多个接口】多实现【一个类可以实现多个接口】

5.接口的多继承多实现

  1. 接口可以继承接口,并且可以多继承,多个接口之间用逗号隔开
  2. 接口与实现类是实现的关系,并且可以多实现,多个接口之间用逗号隔开
  3. 对于java中的类而言,遵循:单继承,多实现
    — 一个类只能有一个父类,但是一个类可以实现多个接口
package partTwo;
/*本类用于测试接口与类之间的复杂关系*/
public class TestRelation {
    public static void main(String[] args) {
        //创建对象进行功能测试
        Inter3Impl i = new Inter3Impl();
        i.save();
        i.delete();
        i.update();
        i.find();
    }
}

//1.创建接口1
interface Inter1{
    void save();//保存功能
    void delete();//删除功能
}
//2.创建接口22
interface Inter22{
    void update();//更新功能
    void find();//查询功能
}
//3.创建接口1的实现类
class Inter1Impl implements Inter1{
    @Override
    public void save() { }
    @Override
    public void delete() { }
}

//4.创建接口3,同时继承两个接口
/*1.接口可以继承接口,并且可以多继承,多个接口之间用逗号隔开*/
interface Inter3 extends Inter1,Inter22{ }

//5.创建接口3的实现类
/*2.接口与实现类是实现的关系,并且可以多实现,多个接口之间用逗号隔开
 * 对于Java中的类而言,遵循:单继承 多实现
 * 一个类只能有一个父类,但是一个类可以实现多个接口*/
//class Inter3Impl implements Inter3{//写法1
class Inter3Impl implements Inter1,Inter22{//写法2
    @Override
    public void save() {
        System.out.println("稍等...正在努力保存中...");
    }
    @Override
    public void delete() {
        System.out.println("删除成功!");
    }
    @Override
    public void update() {
        System.out.println("小二正在马不停蹄的更新~");
    }
    @Override
    public void find() {
        System.out.println("客官,马上就查询好啦,稍等一丢丢~");
    }
}

6.接口总结

6.1 类与类的关系

继承关系,只支持单继承
比如,A是子类 B是父类,A具备B所有的功能(除了父类的私有资源和构造方法)
子类如果要修改原有功能,需要重写(方法签名与父类一致 + 权限修饰符>=父类修饰符)

6.2 类与接口的关系

实现关系.可以单实现,也可以多实现
class A implements B,C{}
其中A是实现类,B和C是接口,A拥有BC接口的所有功能,只是需要进行方法的重写,否则A就是抽象类

6.3 接口与接口的关系

是继承关系,可以单继承,也可以多继承
interface A extends B,C{}
其中ABC都是接口,A是子接口,具有BC接口的所有功能(抽象方法)
class X implements A{}
X实现类需要重写ABC接口的所有方法,否则就是抽象类
class A extends B implements C,D{}
其中A是实现类,也是B的子类,同时拥有CD接口的所有功能
这时A需要重写CD接口里的所有抽象方法

6.4 抽象类与接口的区别

  1. 抽象类是一个特殊的类,这个类被abstract修饰,抽象类中可以包含没有方法体的方法(抽象方法)
    接口可以理解成一个特殊的抽象类,特殊在,接口里的都是抽象方法,没有普通方法
    但是注意:接口不是类,接口使用interface关键字来定义
    接口会为方法自动拼接public abstract,还会为变量自动拼接public final static
  2. 抽象类可以有构造方法–用来给子类创建对象,接口中没有构造方法
    注意:抽象类的子类调用的就是抽象类的构造,但接口的实现类调用的是自己父类的构造方法
  3. 抽象类和接口都不能实例化(创建对象)
  4. 接口可继承接口,并可多继承接口,但类只能单继承
  5. 抽象方法只能声明,不能实现,接口是设计的结果 ,抽象类是重构的结果
    抽象类中可以定义普通的成员变量,但接口中都是静态常量
  6. 抽象是后天重构的结果,接口是先天设计的结果

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

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

相关文章

webpackEslint插件使用

webpackEslint插件使用 首先安装eslint-webpack-plugin npm i eslint-webpack-plugin -S 注意:如果未安装eslint>7,还需要先安装eslint npm i eslint -S 然后把插件添加到你的webpack配置,例如 const ESLintPluginreuqire(eslint-webpack-plugin) mo…

Android开发常谈—【热启动冷启动】

冷启动概述 app冷启动: 当应用启动时,后台没有该应用的进程,这时系统会重新创建一个新的进程分配给该应用, 这个启动方式就叫做冷启动(后台不存在该应用进程)。冷启动因为系统会重新创建一个新的进程分配给…

【坤坤讲师--图】KM算法

KM算法 KM算法是通过给每个顶点一个标号(叫做顶标)来把求最大权匹配的问题转化为求完备匹配的问题的。设顶点Xi的顶标为A[i],顶点Yj的顶标为B[j],顶点Xi与Yj之间的边权为w[i,j]。在算法执行过程中的任一时刻,对于任一条边(i,j),A[i]+B[j]>=w[i,j]始终成立。KM算法的正…

Python语言零基础入门教程(一)

Python 基础语法 Python 语言与 Perl,C 和 Java 等语言有许多相似之处。但是,也存在一些差异。 在本章中我们将来学习 Python 的基础语法,让你快速学会 Python 编程。 第一个 Python 程序 交互式编程 交互式编程不需要创建脚本文件&#…

【算法竞赛模板】单调队列与单调栈

【算法竞赛模板】单调队列与单调栈一、概念解析二、单调栈三、单调队列一、概念解析 单调栈:具有单调(递增或递减)性质和栈性质的数据结构     时间复杂度为 O(n)单调队列:具有单调(递增或递减)性质和…

R22-11 《Specification of Time Synchronization》文摘

1 Introduction and functional overview【功能】Time Synchronization between different applications and/or ECUs【目的】be able to track such events in time or to trigger them at an accurate point in time.【方式】ATime Synchronization APIis offered to the App…

webpack基础理解

webpack基础理解 webpack就是将不同格式的文件打包成浏览器能够执行识别的文件 首先创建一些文件 npm init -y 初始化文件 生成一个配置文件package.json 这里如果直接打开静态文件引入main 他会提示你import引入这种模块化语法有问题浏览器并不能直接识别,这时就…

计算机组成原理 第四章笔记记录

为笔记记录,会有个人的理解在里面,若有错误请指出,看到了就改,视频链接 指令格式 指令和指令集的定义 指令:指示计算机执行某种操作的命令,是计算机运行的最小功能单位 指令集:一台计算机的所有指令的集合构成该计算机的指令系统…

微信小程序【获取用户昵称头像和昵称(附源码)】

获取用户昵称头像和昵称 wx.getUserProfile bindgetuserinfo 登录过程 前端源码:https://pan.baidu.com/s/1uz2Gm2FMB-8RFVkhlHY3kQ 提取码:zb4w 后端源码:https://pan.baidu.com/s/1iPpLrXzWnpAsk5UsfKesGw 提取码:8bwm 小程…

Java poi之word文本图片内容提取

目录结构前言文档准备引入Maven依赖代码块提取结果验证孤勇者提取结果青鸟提取结果对比前言 应公司需求,需实现以下功能 word文本内容的替换;word文本内容的提取;word文档中图片的提取存放 此文章将使用Apache POI实现Word文档中文本内容及…

2023-2-3 刷题情况

二叉树着色游戏 题目描述 有两位极客玩家参与了一场「二叉树着色」的游戏。游戏中,给出二叉树的根节点 root,树上总共有 n 个节点,且 n 为奇数,其中每个节点上的值从 1 到 n 各不相同。 最开始时: 「一号」玩家从 …

BIGEMAP GIS Office添加离线地图

BIGEMAP GIS Office添加离线地图发布时间:2019-01-04 版权:BIGEMAP添加离线地图相关应用:搭建 离线地图 二次开发目的:搭建内网地图服务器,内网中可多人访问的地图服务,无需上网工具下载:1、BIG…

2023年企业必不可少的私域运营系统

随着人口红利消失、流量越来越贵、公域转化越来越难,2023年,能够提升用户全生命周期的私域运营,已经成为企业不得不做的事。 面对这种情况,企业必须要引入一款专业且高效的私域运营利器,来实现高效率私域运营管理。快…

二叉树层次遍历的C语言实现

二叉树 树是n个节点的有限集 每个节点事多有两颗子树的树称为 二叉树 二叉树的层次遍历 使用队列的数据结构,从树的根结点开始,依次将其左孩子和右孩子入队。而后每次队列中一个结点出队,都将其左孩子和右孩子入队,直到树中所有结…

Linux——死锁概念介绍和解决方式

目录 一.死锁概念介绍 二.死锁的解决方式 (一).预防死锁 方式一:不请求 方式二:强制剥夺资源 方式三:线性分配资源 (二).避免死锁:银行家算法 总体流程 安全性检查&#xf…

C语言---冒泡排序和快速排序

文章目录前言一、冒泡排序1.简介2.算法思路3.代码实现二、快速排序1.简介2.算法思路2.1左右指针法2.2挖坑法2.3前后指针法总结前言 交换排序有冒泡排序和快速排序这两种, 基本思想:所谓交换,就是根据序列中两个记录键值的比较结果来对换这两…

多目标跟踪:文献综述

文章目录摘要1、简介1.1、与其他相关综述的区别1.2、贡献1.3、综述的结构1.4. 外延2、 MOT问题2.1、问题公式化2.2、MOT的分类2.2.1、初始化方法2.2.2、处理方式2.2.3、输出类型2.2.4. 讨论3、MOT的组成3.1、外观模型3.1.1、视觉表征3.1.2. 统计测量3.2、运动模型3.2.1. 线性运…

安装httprunner manager遇到的坑

安装httprunner manager参考博客:https://www.cnblogs.com/MrqiuS/p/12944481.html安装mysqlclient报错Collecting mysqlclient1.3.12Downloading https://mirrors.aliyun.com/pypi/packages/6f/86/bad31f1c1bb0cc99e88ca2adb7cb5c71f7a6540c1bb001480513de76a931/m…

maven利用springboot的配置文件进行多个环境的打包

在Spring Boot中多环境配置文件名需要满足application-{profiles.active}.properties的格式,其中{profiles.active}对应你的环境标识,可以随意命名,但要与pom文件中环境标识一样。至于哪个具体的配置文件会被加载,需要在applicati…

Docker系列 01

前言 学完这篇文章,你会知道Docker是什么?解决了什么问题以及如何安装Docker。在后续的系列文章中,我们会陆续介绍Docker的常用命令、镜像原理、Dockerfile以及网络管理等,让你对Docker有较为系统的认知,持续关注吧。 …