Java(十)——接口

news2024/11/23 11:27:08

个人简介

👀个人主页: 前端杂货铺
开源项目: rich-vue3 (基于 Vue3 + TS + Pinia + Element Plus + Spring全家桶 + MySQL)
🙋‍♂️学习方向: 主攻前端方向,正逐渐往全干发展
📃个人状态: 研发工程师,现效力于中国工业软件事业
🚀人生格言: 积跬步至千里,积小流成江海
🥇推荐学习:🍖开源 rich-vue3 🍍前端面试宝典 🍉Vue2 🍋Vue3 🍓Vue2/3项目实战 🥝Node.js实战 🍒Three.js

🌕个人推广:每篇文章最下方都有加入方式,旨在交流学习&资源分享,快加入进来吧

内容参考链接
Java基础(一)Hello World,8种数据类型,键盘录入
Java基础(二)数组,方法,方法重载
Java基础(三)类和对象、构造方法
Java基础(四)字符串、StringBuffer、StringBuilder、StringJoiner
Java基础(五)ArrayList
Java基础(六)继承
Java基础(七)多态
Java基础(八)包、final、权限修饰符、静态代码块
Java基础(九)抽象类、抽象方法

文章目录

    • 前言
    • 接口的定义和使用
    • 接口中成员的特点
    • 接口和类之间的关系
    • 接口中新增的方法
      • 默认方法
      • 静态方法
      • 私有方法
    • 总结

前言

大家好,这里是前端杂货铺。

本篇文章,我们学习 接口


接口的定义和使用

  • 接口用关键字 interface 来定义
public interface 接口名 {}
  • 接口不能被实例化
  • 接口和类之间是实现关系,通过 implements 关键字表示
public class 类名 implements 接口名 {}
  • 接口的子类(实现类)要么 重写接口中的所有抽象方法,要么 是抽象类

注意:

  1. 接口和类的实现关系,可以单实现,也可以多实现
public class 类名 implements 接口名1, 接口名2 {}
  1. 实现类还可以在继承一个类的同时实现多个接口
public class 类名 extends 父类 implements 接口名1, 接口名2 {}

下面,我们把游泳定义为一个接口,实现青蛙和兔子的相关属性和行为的输出:

在这里插入图片描述

在这里插入图片描述

Swim.java

public interface Swim {
    public abstract void swim();
}

Animal.java

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

    public Animal() {
    }

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

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public abstract void eat();
}

Frog.java

public class Frog extends Animal implements Swim {
    public Frog() {
    }

    public Frog(String name, int age) {
        super(name, age);
    }

    @Override
    public void eat() {
        System.out.println("青蛙在吃虫子");
    }

    @Override
    public void swim() {
        System.out.println("青蛙在游泳");
    }
}

Rabbit.java

public class Rabbit extends Animal{
    public Rabbit() {
    }

    public Rabbit(String name, int age) {
        super(name, age);
    }

    @Override
    public void eat() {
        System.out.println("兔子在吃胡萝卜");
    }
}

Test.java

public class Test {
    public static void main(String[] args) {
        Frog f = new Frog("青蛙", 1);
        System.out.println(f.getName() + ", " + f.getAge());

        f.eat();
        f.swim();

        Rabbit r = new Rabbit("兔子", 2);
        System.out.println(r.getName() + ", " + r.getAge());

        r.eat();
    }
}

在这里插入图片描述


接口中成员的特点

成员变量:只能是常量,默认修饰符:public static final

构造方法:没有。

成员方法:只能是抽象方法,默认修饰符:public abstract

注意事项:

  • JDK7 以前:接口中只能定义抽象方法。
  • JDK8:接口中可以定义有方法体的方法。
  • JDK9:接口中可以定义私有方法。

Inter.java

public interface Inter {
    int num = 20;

    // 即使不加 public abstract,也会默认加上的
    public abstract void method();
}

InterImpl.java

public class InterImpl implements Inter {

    @Override
    public void method() {
        System.out.println("重写的抽象方法");
    }
}

Test.java

public class Test {
    public static void main(String[] args) {
        System.out.println(Inter.num);

        InterImpl i = new InterImpl();
        i.method();
    }
}

在这里插入图片描述


接口和类之间的关系

类与类的关系:继承关系,只能单继承,不能多继承,但是可以多层继承。

类与接口的关系:实现关系,可以单实现,也可以多实现,还可以在继承一个类的同时实现多个接口。

接口和接口的关系:可以单继承,也可以多继承。

下面我们实现一下接口的多继承:

Inter1.java

public interface Inter1 {
    public abstract void method1();
}

Inter2.java

public interface Inter2 {
    public abstract void method2();
}

Inter3.java

public interface Inter3 extends Inter1, Inter2 {
    public abstract void method3();
}

InterImpl.java

public class InterImpl implements Inter3 {

    @Override
    public void method1() {

    }

    @Override
    public void method2() {

    }

    @Override
    public void method3() {

    }
}

接口中新增的方法

默认方法

允许在接口中定义默认方法,需要使用关键字 default 修饰。——作用:解决接口升级问题。

接口中 默认方法 的定义格式:

  • 格式:public default 返回值类型 方法名(参数列表) {}
  • 范例:public default void show() {}

接口中默认方法的 注意事项

  • 默认方法不是抽象方法,所以不强制被重写。但是如果被重写,重写的时候去掉 default 关键字。
  • public 可以省略,default 不能省略
  • 如果实现了多个接口,多个接口中存在相同名字的默认方法,子类就必须对该方法进行重写

接口中编写默认方法

InterA.java

public interface InterA {
    // 抽象方法
    public abstract void method();

    // 默认方法
    public default void show() {
        System.out.println("InterA 接口中的默认方法");
    }
}

InterAImpl.java

public class InterAImpl implements InterA{
    @Override
    public void method() {
        System.out.println("实现类重写的抽象方法");
    }
}

Test.java

public class Test {
    public static void main(String[] args) {
        InterAImpl i = new InterAImpl();

        i.method();
        i.show();
    }
}

在这里插入图片描述


实现了多个接口,多个接口中存在相同名字的默认方法,子类就必须对该方法进行重写:

InterA.java

public interface InterA {
    // 抽象方法
    public abstract void method();

    // 默认方法
    public default void show() {
        System.out.println("InterA 接口中的默认方法");
    }
}

InterB.java

public interface InterB {
    public default void show() {
        System.out.println("InterB 接口中的默认方法");
    }
}

InterAImpl.java

public class InterAImpl implements InterA, InterB {
    @Override
    public void method() {
        System.out.println("实现类重写的抽象方法");
    }

    @Override
    public void show() {
        System.out.println("实现类重写接口中的默认方法");
    }
}

Test.java

public class Test {
    public static void main(String[] args) {
        InterAImpl i = new InterAImpl();

        i.method();
        i.show();
    }
}

在这里插入图片描述

PS:不重写,会报错,因为此时不知道调哪个接口的默认方法

在这里插入图片描述


静态方法

允许在接口中定义静态方法,需要使用关键字 static 修饰。

接口中 静态方法 的定义格式:

  • 格式:public static 返回值类型 方法名(参数列表) {}
  • 范例:public static void show() {}

接口中静态方法的 注意事项

  • 静态方法只能通过接口名调用,不能通过实现类名或者对象名调用。
  • public 可以省略,static 不能省略。

Inter.java

public interface Inter {
    public abstract void method();

    public static void show() {
        System.out.println("Inter 接口中的静态方法");
    }
}

InterImpl.java

public class InterImpl implements Inter{
    @Override
    public void method() {
        System.out.println("InterImpl 重写的抽象方法");
    }

    public static void show() {
        System.out.println("InterImpl 实现类中的 show 方法");
    }
}

Test.java

public class Test {
    public static void main(String[] args) {
    	// 调用接口中的静态方法
        Inter.show();
		// 调用实现类中的静态方法
        InterImpl.show();
    }
}

在这里插入图片描述


私有方法

接口中私有方法的定义格式:

  • 范例1:private void show() {}
  • 范例2:private static void method() {}

Inter.java

public interface Inter {
    public static void show1() {
        System.out.println("show1 方法");
        show3();
    }

    public static void show2() {
        System.out.println("show2 方法");
        show3();
    }

    private static void show3() {
        System.out.println("仅允许此java文件里的静态方法调我 --- haha");
    }
}

Test.java

public class Test {
    public static void main(String[] args) {
        Inter.show1();
        Inter.show2();
    }
}

在这里插入图片描述


总结

本篇文章我们学习了接口的定义、特点及相关使用,是不是收获满满呢!

好啦,本篇文章到这里就要和大家说再见啦,祝你这篇文章阅读愉快,你下篇文章的阅读愉快留着我下篇文章再祝!


参考资料:

  1. Java 基础(bilibili-黑马程序员)
  2. 菜鸟教程–Java

在这里插入图片描述


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

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

相关文章

数据库表的行列转换(行转列,列转行)

目录 前言 行转列 创建测试表 score1 插入测试数据 需求与通用SQL写法 列转行 创建测试表 score2 插入测试数据 需求与通用SQL写法 前言 在工作中,多多少少都会遇到一些数据展示的需求,开发一个接口,从数据库中查询数据返回页面展示…

Thinkphp仿华为商城源码/红色风格电脑手机数码商城系统网站源码

Thinkphp仿华为商城,主要实现了商品首页展示、用户意见、商品分类列表、商品搜索、商品详细展示、购物车、订单生成、在线付款、以及个人中心完善个人资料、用户修改收货地址、余额查询、消费查询、订单管理、商品评价、热销商品和最近商品浏览; 后台是…

Langchain核心模块与实战[8]:RAG检索增强生成[loader机制、文本切割方法、长文本信息处理技巧]

Langchain核心模块与实战[8]:RAG(Retrieval Augmented Generation,检索增强生成) RAG(Retrieval-Augmented Generation)技术是一种结合检索和生成功能的自然语言处理(NLP)技术。该技术通过从大型外部数据库中检索与输入问题相关的信息,来辅助生成模型回答问题。其核心…

面试重点---快速排序

快排单趟 快速排序是我们面试中的重点,这个知识点也很抽象,需要我们很好的掌握,而且快速排序的代码也是非常重要,需要我们懂了还不行,必须要手撕代码,学的透彻。 在研究快速排序之前,我们首先…

使用 Arduino 实现 PID 控制器

使用 Arduino 实现 PID 控制器 PID controller implementation using Arduino (microcontrollerslab.com) In this article, you will learn how to design PID controller using Arduino. PID controller can implemented using both analog and digital electronics. But in…

Java 基础 and 进阶面试知识点(超详细)

一个 Java 文件中是否可以存在多个类(修饰类除外)? 一个 Java 文件中是可以存在多个类的,但是一个 Java 文件中只能存在一个 public 所修饰的类,而且这个 Java 文件的文件名还必须和 public 所修饰类的类名保持一致&a…

斯坦福UE4 C++课学习补充 14:UMG-优化血量条

文章目录 一、优化执行效率二、简单脉冲动画 一、优化执行效率 绑定事件需要每一帧检查绑定对象是否有变化,势必造成CPU资源的浪费,因此优化执行效率的思路是:UI组件不再自行每帧查询血量,而是让血量自己在发生变化的同时通知UI进…

软件全过程建设资料,交付资料,方案等

在软件开发过程中,文档扮演着至关重要的角色。它不仅记录了项目的需求、设计和开发过程,还为项目的维护和管理提供了便利。本文将详细介绍软件开发文档的重要性和作用,以及需求分析、软件设计、开发过程、运维管理和项目管理等方面的文档编写…

【机器学习】深入理解损失函数(Loss Functions)

🌈个人主页: 鑫宝Code 🔥热门专栏: 闲话杂谈| 炫酷HTML | JavaScript基础 ​💫个人格言: "如无必要,勿增实体" 文章目录 深入理解损失函数(Loss Functions)什么是损失函数?常见损失函数类型1. 均方误差…

[译] 深入浅出Rust基金会

本篇是对 RustConf 2023中的Rust Foundation: Demystified这一视频的翻译与整理, 过程中为符合中文惯用表达有适当删改, 版权归原作者所有. 大家好,我是Sage Griffin,我的代词是they/them。我今天来这里是要谈谈Rust基金会。 要了解基金会实际做什么,我们需要理解美国国内税收…

微软第四季度财报预览:增长动力追踪

微软公司即将在2024年7月30日(周二)美国市场收盘后发布第四季度财务结果。 微软的收益 - 预期如何 美股券商开户通道 市场预计,微软即将到来的2024年第四季度的收入将年增长14.5%,达到644亿美元,高于2023年第四季度…

【Leetcode】二十、记忆化搜索:零钱兑换

文章目录 1、记忆化搜索2、leetcode509:斐波那契数列3、leetcode322:零钱兑换 1、记忆化搜索 也叫备忘录,即把已经计算过的结果存下来,下次再遇到,就直接取,不用重新计算。目的是以减少重复计算。 以前面提…

【.NET 6 实战--孢子记账--从单体到微服务】--开发环境设置

在这一小节,我们将设置开发环境。 一、安装SDK 咱们的项目使用的是 .NET6,开发前我们需要从官网上下载.NET6 SDK(点击下载),这里要注意的是我们需要下载.NET6 SDK,而不是 .NET6 Runtiem 。SDK 包含 Runti…

2021真题-架构师案例(四)

问题1(16分) 针对该系统功能,赵工建议解释器架构风格,李工建议管道过滤架构风格,王工则建议饮食调用,该系统从灵活性和可扩展性考虑,应采用哪种? 解析: 管道-过滤器&am…

这些有用的免费网站和工具,很多人却都不知道

在信息爆炸的今天,很多用户都不知道有哪些免费好用的网站和工具,今天小编就来和大家分享几款免费又好用的网站或工具,以便大家提升工作效率。 滴答清单:高效时间管理 滴答清单是一款广受欢迎的时间管理工具,它可以帮…

【C++】面向对象的软件设计原则

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; &#x1f525;c系列专栏&#xff1a;C/C零基础到精通 &#x1f525; 给大…

字符串变换 482、6、68

482. 密钥格式化&#xff08;简单&#xff09;&#xff08;20mins&#xff09; 给定一个许可密钥字符串 s&#xff0c;仅由字母、数字字符和破折号组成。字符串由 n 个破折号分成 n 1 组。你也会得到一个整数 k 。 我们想要重新格式化字符串 s&#xff0c;使每一组包含 k 个字…

AndroidStudio 开发环境搭建

文章目录 AndroidStudio 开发环境搭建JDK 下载与安装&#xff0c;配置环境变量JDK1.8 下载安装配置环境变量新建JAVA_HOME编辑Path 下载AndroidStudio最新版本历史版本先安装JDK&#xff0c;后启动AS以管理员身份运行打开解决双击打不开的问题Error:你的主机中的软件中止了一个…

Golang | Leetcode Golang题解之第299题猜数字游戏

题目&#xff1a; 题解&#xff1a; func getHint(secret, guess string) string {bulls : 0var cntS, cntG [10]intfor i : range secret {if secret[i] guess[i] {bulls} else {cntS[secret[i]-0]cntG[guess[i]-0]}}cows : 0for i : 0; i < 10; i {cows min(cntS[i], c…

数据结构——单链表OJ题(下)

目录 一、链表的回文结构 思路一&#xff1a;数组法 &#xff08;1&#xff09;注意 &#xff08;2&#xff09;解题 思路二&#xff1a;反转链表法 &#xff08;1&#xff09; 注意 &#xff08;2&#xff09;解题 二、相交链表 &#xff08;1&#xff09;思路&#…