当前位置: 首页 > news >正文

Java(十)——接口

个人简介

👀个人主页: 前端杂货铺
开源项目: 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);}@Overridepublic void eat() {System.out.println("青蛙在吃虫子");}@Overridepublic void swim() {System.out.println("青蛙在游泳");}
}

Rabbit.java

public class Rabbit extends Animal{public Rabbit() {}public Rabbit(String name, int age) {super(name, age);}@Overridepublic 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 {@Overridepublic 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 {@Overridepublic void method1() {}@Overridepublic void method2() {}@Overridepublic 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{@Overridepublic 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 {@Overridepublic void method() {System.out.println("实现类重写的抽象方法");}@Overridepublic 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{@Overridepublic 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

在这里插入图片描述


相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【中项】系统集成项目管理工程师-第8章 信息安全工程-8.2信息安全系统
  • 浏览器自动化测试工具selenium——爬虫操作记录
  • 每天一个数据分析题(四百五十八)- 根因分析
  • 基于SpringBoot+Vue的热门网游推荐网站(带1w+文档)
  • 使用requests库进行网络爬虫:入门指南
  • upload-labs靶场(1-19关)
  • TongHttpServer 简介
  • 美团后端二面
  • Docker容器下面home assistant忘记账号密码怎么重置?
  • LINUX -exec函数族
  • npm提示 certificate has expired 证书已过期 已解决
  • Wi-Fi、WLAN、Bluetooth、zigbee、蜂窝网络、4g5g、MQTT
  • 355_C++_自动维护时间点计算,以天、小时(00:00-02:00、02:00-04:00 ......)来计算
  • [数据结构] AVL树 模拟实现AVL树
  • Kafka的入门及简单使用
  • 9月CHINA-PUB-OPENDAY技术沙龙——IPHONE
  • [分享]iOS开发 - 实现UITableView Plain SectionView和table不停留一起滑动
  • [译]Python中的类属性与实例属性的区别
  • 【140天】尚学堂高淇Java300集视频精华笔记(86-87)
  • 【跃迁之路】【585天】程序员高效学习方法论探索系列(实验阶段342-2018.09.13)...
  • 2017 前端面试准备 - 收藏集 - 掘金
  • Android路由框架AnnoRouter:使用Java接口来定义路由跳转
  • Angular6错误 Service: No provider for Renderer2
  • bootstrap创建登录注册页面
  • gitlab-ci配置详解(一)
  • JDK 6和JDK 7中的substring()方法
  • markdown编辑器简评
  • Redis字符串类型内部编码剖析
  • Vue2.x学习三:事件处理生命周期钩子
  • 初识 webpack
  • 简单实现一个textarea自适应高度
  • 猫头鹰的深夜翻译:JDK9 NotNullOrElse方法
  • 使用 Node.js 的 nodemailer 模块发送邮件(支持 QQ、163 等、支持附件)
  • 使用Gradle第一次构建Java程序
  • 微信支付JSAPI,实测!终极方案
  • Android开发者必备:推荐一款助力开发的开源APP
  • 容器镜像
  • # Panda3d 碰撞检测系统介绍
  • #Z2294. 打印树的直径
  • #图像处理
  • #我与Java虚拟机的故事#连载16:打开Java世界大门的钥匙
  • $GOPATH/go.mod exists but should not goland
  • (NO.00004)iOS实现打砖块游戏(九):游戏中小球与反弹棒的碰撞
  • (待修改)PyG安装步骤
  • (第三期)书生大模型实战营——InternVL(冷笑话大师)部署微调实践
  • (二) 初入MySQL 【数据库管理】
  • (非本人原创)史记·柴静列传(r4笔记第65天)
  • (分布式缓存)Redis哨兵
  • (附源码)基于SpringBoot和Vue的厨到家服务平台的设计与实现 毕业设计 063133
  • (更新)A股上市公司华证ESG评级得分稳健性校验ESG得分年均值中位数(2009-2023年.12)
  • (四)事件系统
  • (一)基于IDEA的JAVA基础12
  • (转)创业家杂志:UCWEB天使第一步
  • ****Linux下Mysql的安装和配置
  • ./configure、make、make install 命令