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

Javase 基础入门 —— 07 接口

本系列为笔者学习Javase的课堂笔记,视频资源为B站黑马程序员出品的《黑马程序员Java+AI智能辅助编程全套视频教程,java零基础入门到大牛一套通关》,章节分布参考视频教程,为同样学习Javase系列课程的同学们提供参考。

01 概述

接口采用interface关键字定义,在JDK8之前,接口中只能定义常量和抽象方法。

在这里插入图片描述

接口是用来被类实现(implements)的,实现接口的类称为实现类,一个类可以同时实现多个接口。

注:接口不能创建对象!亲爸是抽象类,干爹是接口!

在这里插入图片描述

A.interfaceA接口

public interface A {//常量//public static final String SCHOOL_NAME = "黑马程序员";String SCHOOL_NAME = "黑马程序员";//抽象方法//public abstract void run();void run();
}

B.interfaceB接口

public interface B {void cry();
}

C.java C实现类

public class C implements A, B{@Overridepublic void run(){System.out.println("run");}@Overridepublic void cry(){System.out.println("cry");}
}

Test.java 测试程序

public class Test {public static void main(String[] args) {System.out.println(A.SCHOOL_NAME);C c = new C();c.run();c.cry();}
}

在这里插入图片描述

02 好处

  • 弥补了类单继承的不足,一个类可以实现多个接口,功能强大
  • 使得程序可以面向接口编程,实现解耦合,切换各种业务实现
public class Test {public static void main(String[] args) {Driver d = new Student();Friend f = new Student();People p = new Student();Driver d1 = new Student();Driver d2 = new Teacher();}}interface Driver{}
interface Friend{}
class People{}class Student extends People implements Driver, Friend{}
class Teacher extends People implements Driver{}

03 案例:实现一个班级学生信息管理模块

在这里插入图片描述

Student.java 自定义数据库

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;@Data
@NoArgsConstructor
@AllArgsConstructor
public class Student {private String name;private char gender;private double score;
}

ClassDataInfer.interface 自定义接口

public interface ClassDataInter {void printAllStudentInfos();void printAverageScore();
}

Test.java 主程序

public class Test {public static void main(String[] args) {//自己定义的Student类Student[] allStudents = new Student[10];allStudents[0] = new Student("张三", '男', 85);allStudents[1] = new Student("李四", '女', 68);allStudents[2] = new Student("王五", '男', 49);allStudents[3] = new Student("赵六", '男', 95);allStudents[4] = new Student("吴七", '女', 78);allStudents[5] = new Student("钱八", '女', 82);allStudents[6] = new Student("孙九", '男', 64);allStudents[7] = new Student("施十", '女', 21);allStudents[8] = new Student("刘十一", '女', 55);allStudents[9] = new Student("贾十二", '男', 88);//面向接口编程ClassDataInter c = new ClassDataInterImpl2(allStudents);c.printAllStudentInfos();c.printAverageScore();}
}

ClassDataInferImpl1.java 实现类1

public class ClassDataInterImpl1 implements ClassDataInter{//数据传送private Student[] students;public ClassDataInterImpl1(Student[] students){ //有参构造上大分this.students = students;}@Overridepublic void printAllStudentInfos() {System.out.println("全班同学的信息如下:");for(int i=0; i<students.length; ++i){Student s = students[i];System.out.println(s.getName() + s.getGender() + s.getScore());}}@Overridepublic void printAverageScore() {double sum = 0;for(int i=0; i<students.length; ++i){Student s = students[i];sum += s.getScore();}System.out.println("全班同学的平均分为:" + sum/students.length);}
}

在这里插入图片描述

ClassDataInferImpl2.java 实现类2

public class ClassDataInterImpl2 implements ClassDataInter{private Student[] students;public ClassDataInterImpl2(Student[] students){this.students = students;}@Overridepublic void printAllStudentInfos() {int male = 0;int female = 0;System.out.println("全班同学的信息如下:");for(int i=0; i<students.length; ++i){Student s = students[i];if(s.getGender() == '男'){male++;}else{female++;}System.out.println(s.getName() + s.getGender() + s.getScore());}System.out.println("男生" + male + "人, 女生" + female + "人");}@Overridepublic void printAverageScore() {double sum = 0;double max = 0;double min = 100;for(int i=0; i<students.length; ++i){Student s = students[i];if(min > s.getScore()){min = s.getScore();}if(max < s.getScore()){max = s.getScore();}sum += s.getScore();}System.out.println("去掉最高分和最低分, 全班同学的平均分为:" + (sum-max-min)/students.length);}
}

在这里插入图片描述

04 三大新增方法

A.interface 自定义接口

public interface A {//1.默认方法default void go(){ //子类对象调用System.out.println("==go方法执行了==");run();}//2.私有方法private void run(){ //类中方法调用System.out.println("==run方法执行了=="); }//3.静态方法static void show(){ //接口名调用System.out.println("==show方法执行了==");}
}

Test.java

public class Test {public static void main(String[] args) {B b = new B();b.go();A.show();}
}class B implements A{}

05 注意事项

  • 一个接口可以同时继承多个接口
  • 如果多个接口中存在方法签名冲突,则此时不支持多继承,也不支持多实现
  • 如果父类中和接口中有同名的默认方法,实现类会优先用父类的
  • 如果多个接口中存在同名的默认方法,可以不冲突,这个类重写该方法即可
public class Test {public static void main(String[] args) {C2 c = new C2();c.show();}
}//1
//类与类 单继承 一个类只能继承一个父类
//类与接口 多实现 一个类可以实现多个接口
//接口与接口 多继承 一个接口可以继承多个接口interface A{void show1();
}
interface B{void show2();
}
interface C extends A, B{ //1.多继承void show3();
}class D implements C{@Overridepublic void show1() {}@Overridepublic void show2() {}@Overridepublic void show3() {}
}//2
interface A1{void show();
}
interface B1{//String show(); //2.签名冲突
}class C1 implements A1, B1{@Overridepublic void show() {}
}//3
interface A2{default void show(){System.out.println("==A2的show方法被调用");}
}class B2{public void show(){System.out.println("==B2的show方法被调用"); //3.优先调用父类同名方法}
}class C2 extends B2 implements A2{}//4
interface A3{default void show(){System.out.println("==A3的show方法被调用");}
}interface B3{default void show(){System.out.println("==B3的show方法被调用");}
}class C3 implements A3, B3{public void show(){System.out.println("==C3的show方法被调用"); //4.方法重写}
}

06 抽象类和接口对比

相同点

  • 都是抽象形式,都可以有抽象方法,都不能创建对象
  • 都是派生子类形式:抽象类是被子类继承,接口是被子类实现
  • 一个类继承抽象类或实现接口,都要重写抽象方法
  • 都能多态、解耦合

不同点

  • 抽象类可以定义类的所有普通成员,接口只能定义常量和抽象方法
  • 抽象类只能单继承,接口可以多实现
  • 抽象类适用于模板,实现父类代码的复用性,接口适用于功能,实现实践的灵活性

07 案例:智能家居控制系统

请你开发一个智能家居系统,可以让用户选择要控制的家用设备(吊灯,电视机,洗衣机,落地窗),并可以对它们进行打开或者关闭操作。

① 定义父类”家具“和子类”电视、洗衣机、灯、空调“

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;@Data
@NoArgsConstructor
@AllArgsConstructor
public class JD implements Switch{private String name; //设备名称private boolean status; //开关@Overridepublic void press(){status = ! status;}
}
public class Lamp extends JD{public Lamp(String name, boolean status){super(name, status);}
}
public class Fridge extends JD{public Fridge(String name, boolean status){super(name, status);}
}
public class Television extends JD{public Television(String name, boolean status){super(name, status);}
}
public class WashMachine extends JD{public WashMachine(String name, boolean status){super(name, status);}
}

② 创建父类对象,添加子类数据

JD[] jds = new JD[4];
jds[0] = new Television("木之本樱电视机", true);
jds[1] = new WashMachine("五条悟洗衣机", true);
jds[2] = new Lamp("蜡笔小新灯", true);
jds[3] = new Fridge("江户川柯南空调", true);

③ 创建接口”开关“,父类”家具“实现

public interface Switch {void press();
}

④ 创建智能控制系统对象,传递父类对象参数

SmartHomeControl smartHomeControl = new SmartHomeControl();
smartHomeControl.control(jds[0]);
//智能控制系统
public class SmartHomeControl {public void control(JD jd){System.out.println(jd.getName() + "的状态是" + (jd.isStatus() ? "开着" : "关着"));System.out.println("===调整开关===");jd.press();System.out.println(jd.getName() + "的状态是" + (jd.isStatus() ? "开着" : "关着"));}
}

Test.java

public class Test {public static void main(String[] args) {//面向对象编程实现智能家居控制系统//角色:设备(吊灯、电视机、洗衣机、落地窗...)//功能:开关//智能家具控制系统(单例对象)控制家具开关//1.定义父类”家具“和子类”电视、洗衣机、灯、空调“//2.创建父类对象,添加子类数据JD[] jds = new JD[4];jds[0] = new Television("木之本樱电视机", true);jds[1] = new WashMachine("五条悟洗衣机", true);jds[2] = new Lamp("蜡笔小新灯", true);jds[3] = new Fridge("江户川柯南空调", true);//3.创建接口”开关“,父类”家具“实现//4.创建智能控制系统对象,传递父类对象参数SmartHomeControl smartHomeControl = new SmartHomeControl();smartHomeControl.control(jds[0]);}
}

⑤ 升级版:输出所有设备状态,死循环控制单个设备

Test.java

while(true){smartHomeControl.printAllJds(jds);System.out.println("===输入待控制设备编号===");Scanner sc = new Scanner(System.in);int number = sc.nextInt();switch (number){case 0:smartHomeControl.control(jds[0]);break;case 1:smartHomeControl.control(jds[1]);break;case 2:smartHomeControl.control(jds[2]);break;case 3:smartHomeControl.control(jds[3]);break;case -1:System.out.println("===退出智能控制系统===");return; //直接干掉main方法default:System.out.println("===请输入0~3之间的整数===");}
}

SmartHomeControl.java

public void printAllJds(JD[] jds){for(int i=0; i<jds.length; ++i){JD jd = jds[i];System.out.println(jd.getName() + "的状态是" + (jd.isStatus() ? "开着" : "关着"));}
}
http://www.xdnf.cn/news/3682.html

相关文章:

  • ChatGPT:重塑人工智能交互范式的破晓之作
  • 【AI论文】交互式生成视频综述
  • 【libuv】基于libuv的exe链接错误
  • JVM——JVM 是如何处理异常的?
  • 传奇各版本迭代时间及内容变化,屠龙/嗜魂法杖/逍遥扇第一次出现的时间和版本
  • Linux53 百度网盘运行(下载devtoolset11后仍提示stdc++3.0.29缺失 计划用docker容器隔离运行,计划后续再看)
  • 鼠标悬浮特效:常见6种背景类悬浮特效
  • Docker与WSL2如何清理
  • 一篇文章看懂web服务
  • NV203NV207SSD固态闪存NV208NV213
  • NoxLucky:个性化动态桌面,打造独一无二的手机体验
  • 用docker ffmpeg测试视频vmaf分数,很快不用编译
  • C#VisionMaster算子二次开发(非方案版)
  • NocoDB:开源的 Airtable 替代方案
  • operator 可以根据需要重载 == 运算符进行比较
  • 《告别试错式开发:TDD的精准质量锻造术》
  • 【quantity】7 角度单位模块(angle.rs)
  • 电脑RGB888P转换为JPEG方案 ,K230的RGB888P转换为JPEG方案
  • CGI(Common Gateway Interface)协议详解
  • 【AI面试准备】TensorFlow与PyTorch构建缺陷预测模型
  • AtCoder AT_abc404_g [ABC404G] Specified Range Sums
  • ​​信息泄露:网站敏感文件泄漏的隐形危机与防御之道​
  • 前端面试每日三题 - Day 23
  • 泰迪杯特等奖案例学习资料:基于时空图卷积网络的城市排水系统水位精准重建与异常检测
  • Power Query精通指南2:数据转换——透视/逆透视/分组、横向纵向合并数据、条件判断、处理日期时间
  • 如何设计抗Crosstalk能力强的PCB镀穿孔
  • Linux 进程间通信(IPC)详解
  • 【计算机视觉】目标检测:yoloV1~yoloV11项目论文及对比
  • 【信息系统项目管理师-论文真题】2011上半年论文详解(包括解题思路和写作要点)
  • LVGL -文本显示 英文、中文