【JAVA学习笔记】41 - 接口

news2024/9/22 21:33:06

项目代码

https://github.com/yinhai1114/Java_Learning_Code/tree/main/IDEA_Chapter10/src/com/yinhai/interface_

一、快速入门

                

        usb插槽就是现实中的接口。你可以把手机,相机,u盘都插在usb插槽上,而不用担心那个插槽是专门插哪个的,原因是做usb的厂家和做各种设备的厂家都遵守了统一的规定包括尺寸,排线等等。

        这样的设计需求在java编程/ php/.net/go中也是会大量存在的,程序就是一个世界,在现实世界存在的情况,在程序中也会出现。使用代码模拟。        interface01

public interface UsbInterface {//创建一个规范,相当于个法则,要想用接口就得有这两个方法
    public void start();

    public void stop();
}
//Phone 类实现UsbInterface
//解读1.即Phone类需要实现UsbInterface接口 规定/声明的方法
public class Phone implements UsbInterface{
    //实现接口,本质就是把接口的方法实现,相当于在规范内实现我自己类的方法
    public void start(){
        System.out.println("手机开始工作...");
    }
    public void stop(){
        System.out.println("手机停止工作...");
    }
}
public class Camera implements UsbInterface{//
    @Override
    public void start() {
        System.out.println("相机开始工作...");
    }

    @Override
    public void stop() {
        System.out.println("相机停止工作...");
    }
}
public class Computer {
    //编写一个方法
    public void work(UsbInterface usbInterface){//创建了个接口,用来接入对象的方法
        usbInterface.start();
        usbInterface.stop();
    }
}
public class Interface01 {
    public static void main(String[] args) {
        //创建手机相机对象
        Camera camera = new Camera();
        Phone phone = new Phone();
        Computer computer = new Computer();
        computer.work(phone);//把手机接入到电脑
        System.out.println("===============");
        computer.work(camera);
    }
}

二、基本介绍 

        接口就是给出一些没有实现的方法,封装到一起到某个类要使用的时候,在根据具体情况把那

些方法写出来。语法: 

        interface 接口名{

                //属性

                //方法(1.抽象方法 2默认实现方法 3静态方法)

        }

        class 类名 implements 接口{

                自己属性;

                自己方法;

                必须实现的接口的抽象方法

        }

1.在Jdk7.0前 接口里的所有方法都没有方法体,即都是抽象方法。

2.Jdk8.0后接口可以有静态方法,默认方法,也就是说接口中可以有方法的具体实现
 

public interface AInterface {
    //写属性
    public int n1 = 10;
    //写方法
    public void hi();//在接口中可以省略abstract关键字
    //jdk 8 后可以有默认实现方法,但是需要使用default关键字修饰
    default public void ok() {
        System.out.println("OK");
    }
    //在jdk8后可以有静态方法
}
//1.如果一个类implements实现接口
//2.需要该接口的所有抽象方法都实现
class A implements AInterface{
    public void hi(){
        System.out.println("hi().....");
    }
}

三、深入讨论

对初学者讲,理解接的概念不算太难,难的是不知道什么时候使用接口,下面我例举几个应用场景:

1.说现在要制造战斗机.武装直升机专家只需把飞机需要的功能/规格定下来即可,然后让别的人具体实现就可。

2.说现在有一个项目经理,管理三个程序员,功能开发一个软件为了控制和管理软件项目经理可以定义一些接口,然后由程序员具体实现。

实际要求: 3个程序员, 编写三个类,分别完成对Mysql,Oracle,DB2数据库的连接

                

public interface DBInterface { //项目经理

    public void connect();//连接方法
    public void close();//关闭连接
}
public class MysqlDB implements DBInterface {
    @Override
    public void connect() {
        System.out.println("连接mysql");
    }

    @Override
    public void close() {
        System.out.println("关闭mysql");
    }
}
//B程序员连接Oracle
public class OracleDB implements DBInterface{

    @Override
    public void connect() {
        System.out.println("连接oracle");
    }

    @Override
    public void close() {
        System.out.println("关闭oracle");
    }
}
public class Interface03 {
    public static void main(String[] args) {

        MysqlDB mysqlDB = new MysqlDB();
        t(mysqlDB);
        OracleDB oracleDB = new OracleDB();
        t(oracleDB);
    }

    public static void t(DBInterface db) {
        db.connect();
        db.close();
    }
}

四、注意事项和细节

1.接口不能被实例化 (接口实际上是特殊抽象类)

2.接口中所有的方法是public方法,接口中抽象方法,可以不用abstract 修饰:

        实际上是abstract void aa();

3.一个普通类实现接口,就必须将该接口的所有方法都实现。

        将光标放到红线使用alt+enter可以快速实现接口方法

        

4.抽象类实现接口,可以不用实现接口的方法。

5.一个类可以同时实现多个接口

6.接口中的属性只能是final的,而且是public static final修饰符。

        比如:int a=1;实际上是public static finai int a=1; (必须初始化)

        

7.接口中属性的访向形式:接口名.属性名

8.一个接口不能继承其它的类但是可以继承多个别的接口

9.接口的修饰符只能是public和默认,这点和类的修饰符是一样的。

五、课堂练习

1.

                

        都正确,因为B实现了A接口,当然拥有接口的成员

六、接口和继承类之间的关系

        可以看做继承类的补充

                

一个对象创建开始就应该继承有父类的内容,但是要有其他功能需要实现接口的方式拓展,可以理解为对java单继承机制的一种补充

public class ExtendsvsInterface {
    public static void main(String[] args) {
        LittleMonkey houzi = new LittleMonkey("houzi");
        houzi.climbing();
        houzi.swimming();
    }
}
interface Fishable{
    void swimming();
}
class Monkey{
    private String name;

    public Monkey(String name) {
        this.name = name;
    }
    public void climbing(){
        System.out.println(name + "会爬树");
    }

    public String getName() {
        return name;
    }
}
class LittleMonkey extends Monkey implements Fishable{

    public LittleMonkey(String name) {
        super(name);
    }
    public void swimming(){
        System.out.println(getName() + "通过学习,可以像鱼一样游泳");
    }
}

1.接口和继承解决的问题不同

        继承的价值主要在于:解决代码的复用性和可维护性。

        接口的价值主要在于:设计设计好各种规范(方法),让其它类去实现这些方法。

2.接口比继承更加灵活

        接口比继承更加灵活,继承是满足is - a的关系,而接口只需满足like - a的关系。

3.接口在一定程度上实现代码解耦【即 接口规范性和动态绑定】

七、多态特性

1.多态参数

        在前面的Usb接口案例,Usb usb,既可以接收手机对象,又可以接收相机对象,就体现了接口多态(接口引用可以指向实现了接口的类的对象)

        传入的对象可以是不同类型,只要是完成了实现接口的对象都可以传入

        接口类型的变量If01 可以指向实现了IF接口的类的对象实例

        ​​​​​​​        

2.多态数组

        案例:给Usb数组中,存放Phone和相机对象,Phone类还有一个特有的方法call
() ,请遍历Usb数组,如果是Phone对象,除了调用Usb接口定义的方法外,还需要调用
Phone特有方法call.

public class InterfacePolyArr {
    public static void main(String[] args) {
        Usb[] usbs = new Usb[2];
        usbs[0] = new Phone_();
        usbs[1] = new Camera_();
        for (int i = 0; i < usbs.length; i++) {
            usbs[i].work();//动态绑定
            if(usbs[i] instanceof Phone_){//判断运行类型是phone
                ((Phone_) usbs[i]).call();//向下转型
            }
        }
    }
}

interface Usb {
    void work();
}

class Phone_ implements Usb {

    @Override
    public void work() {
        System.out.println("手机工作中");
    }
    public void call(){
        System.out.println("手机打电话中");
    }
}

class Camera_ implements Usb {
    @Override
    public void work() {
        System.out.println("相机工作中");
    }
}

3.接口存在多态传递现象

/*
 *  演示多态传递现象
 */
public class InterfacePolyPass {
    public static void main(String[] args) {
        IG ig = new Teacher();
        IH ih = new Teacher();
    }
}
interface IH{
    void hi();
}
interface IG extends IH{}
class Teacher implements IG{//也就是说想要实现IG接口,需要把IG的父类的方法也实现才能调用

    @Override
    public void hi() {
        
    }
}

八、课堂练习

interface A { // 1min看看
    int x = 0; //想到等价于 public static final int x = 0;
}

class B {
    int x = 1;
}

class C extends B implements A {
    public void pX() {
        System.out.println(x);//调用的x不知道是哪一个 考虑改为
        //System.out.println(super.x);
        //System.out.println(A.x);//A是静态的
    }

    public static void main(String[] args) {
        new C().pX();
    }
}

输出1

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

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

相关文章

【广州华锐视点】VR塔吊模拟实操考核系统

随着科技的不断发展&#xff0c;虚拟现实技术已经逐渐渗透到各个领域&#xff0c;为人们带来了全新的体验。在建筑行业中&#xff0c;塔吊作为一种重要的起重设备&#xff0c;其拆装作业的安全与否直接关系到工程质量和人员生命安全。为了提高塔吊拆装作业的安全性和效率&#…

VUE3中 reacitive源码理解

Proxy 在Vue里面定义一个响应式函数 reacitive 会通过 Proxy 进行拦截&#xff0c;在截的时候里面有ge和set track get的时候有一个跟踪函数叫 track track里面会收集各种依赖&#xff0c;把依赖关系做成各种映射的关系&#xff0c;映射关系就叫 targetMap&#xff0c;vue内部拿…

ES6初步了解Map对象(含十种方法)

ES6提供了 Map数据结构。它类似于对象&#xff0c;也是键值对的集合。但是“键”的范围不限于字符串&#xff0c;各种类型的值&#xff08;包括对象&#xff09;都可以当作键。 创建方法 let m new Map()console.log(m)Map的方法 1.set( ) 添加元素 接收两个参数&#xff0c…

使用香橙派并基于Linux实现最终版智能垃圾桶项目 --- 下

最终完成效果视频&#xff1a; 使用香橙派并基于Linux实现最终版带图像识别的可回收垃圾桶 — 下_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1bc411o7zS/?spm_id_from333.999.0.0&vd_source16380169fa415d2d056dd877a8d8c1b7 硬件接线 & 最终实现图 目录 …

智能振弦传感器:参数智能识别技术的重要科技创新

智能振弦传感器&#xff1a;参数智能识别技术的重要科技创新 智能振弦传感器是一种能够自动识别传感器参数的高科技产品。它的研发得益于河北稳控科技的不断创新和努力&#xff0c;其电子标签专用读数模块模块TR01将传感器生产和标定过程实现了自动化。该模块将温度电阻两芯线…

单片机中的 _nop_() 延时以及其相关的基础扩展

使用 _nop_() 函数做延时遇到的一些问题 以及对此延伸出的一些需要了解的基本概念 ...... by 矜辰所致 完善文章内容结构&#xff0c;补充指令周期、机器周期等一些基本概念 2023/10/25前言 最近还是继续做着项目&#xff0c;因为在某 8051 内核芯片上使用到了 I…

Windows隐藏计划任务技术

Windows隐藏计划任务技术 0x00 前置知识 计划任务SCHTASKS命令 SCHTASKSSCHTASKS /Create 参数 SCHTASKS /Create [/S system [/U username [/P [password]]]][/RU username [/RP password]] /SC schedule [/MO modifier] [/D day][/M months] [/I idletime] /TN taskname …

手写SDK的秘诀

目录 什么是SDK?使用SDK的好处&#xff1f;手写SDK经验总结易用性如何提高易用性&#xff1f;1、统一调用2、集中配置3、良好的命名 可理解性1、结构清晰2、统一风格3、编写注释4、说明文档 可扩展性轻量依赖自定义实现 高效稳定 写在最后 什么是SDK? SDK&#xff08;Softwa…

记一次大型微服务项目本地打包迁移部署

记一次大型微服务项目本地打包迁移部署 引代码合并发布过程本地部署服务配置服务打包自启动测试外部依赖排除部分外部依赖 引 服务的运维也是一个挺复杂工作&#xff0c;如项目上线后的一次小版本发布&#xff0c;开发人员需要基于工程最新代码拉取feature分支&#xff0c;本地…

CPU性能优化——“瑞士军刀“

背景 最近在做一些工具的预研工作&#xff0c;会涉及到对工具的压力测试&#xff0c;分析工具的资源消耗等问题&#xff0c;其中CPU 资源消耗是关键指标之一。为了后续性能优化做准备&#xff0c;回顾了以前相关CPU优化知识&#xff0c;并做总结分享。希望能帮助到正在遇到相关…

如何为3D模型设置自发光材质?

1、自发光贴图的原理 自发光贴图是一种纹理贴图&#xff0c;用于模拟物体自发光的效果。其原理基于光的发射和反射过程。 在真实世界中&#xff0c;物体自发光通常是由于其本身具有能够产生光的属性&#xff0c;如荧光物质、发光材料或光源本身。为了在计算机图形中模拟这种效…

Zabbix出现 404Not FoundThe requested URL /zabbix was not found on this server.

目录 一、问题&#xff1a; 二、原因&#xff1a; 三、解决方法&#xff1a; 一、问题&#xff1a; Not Found The requested URL /zabbix was not found on this server. 二、原因&#xff1a; 未找到 在此服务器上找不到请求的 URL /zabbix。 /etc/httpd/conf.d 目录…

AI是未来?——知识导航

AI是未来&#xff1f;——知识导航 文章目录 AI是未来&#xff1f;——知识导航一、问题记录&#xff1a;1. LoRA微调的原理&#xff1f;网络层是什么&#xff1f;2. P-tuning v2原理&#xff1f;3. 词嵌入&#xff0c;word embedding4. 下图含义&#xff1f;5. 过拟合6. loss定…

蓝桥杯双周赛算法心得——摆玩具(分段的差不计入结果)

大家好&#xff0c;我是晴天学长&#xff0c;这是一道可以牢记的数学技巧题。 1) .摆玩具 2) .算法思路 1.创建一个Scanner对象以从用户读取输入。 2.从用户读取n和k的值&#xff0c;分别表示数组的大小和k的值。 3.创建一个大小为n的整数数组a&#xff0c;用于存储输入的数…

C语言 sizeof 函数内部进行计算

直接看代码 #include <stdio.h> int main() {int i 2;int j;j sizeof(i i);printf("i %d, j %d", i ,j);return 0; }执行结果&#xff1a; 可以看到 i的值一直是没有变的&#xff0c; j 是int类型下 sizeof占用的大小为 4个字节&#xff0c;不是i的 22…

百看不厌的85M²现代极简装饰设计。福州中宅装饰,福州装修

简而不凡 设计&#xff0c;是美好生活的序章 每个人&#xff0c;对家都有不同的想法 但对未来美好新居的向往是相同的 ABOUT THE CASE 案例简介&#xff1a; 作品&#xff1a;尽兴 风格&#xff1a;极简 面积&#xff1a;82平方 户型&#xff1a;SOHO 本套案例85㎡的公…

程序员自我修养-思考度

① 自警 考虑太少&#xff0c;牵连少&#xff0c;深度欠缺&#xff0c;易造成浅尝辄止&#xff0c;贻笑大方&#xff1b; 考虑太多&#xff0c;纬度多&#xff0c;关系复杂&#xff0c;易造成画地为牢&#xff0c;寸步难行。 ② 自励 “一个人能同时保有全然相反的两种观念&…

使用示波器探头的一些技巧和注意事项

使用保护电阻。差分探头的引脚可能存在电压过高的风险&#xff0c;因此使用保护电阻可以有效避免引脚损坏。 接地方式的影响。不管单端信号还是差分信号的测量都对接地非常敏感&#xff0c;不同的接地方式可能会对测量结果产生影响。 校准差分探头。定期校准差分探头可以确保…

16结构型模式-组合模式

我们很容易将“组合模式”和“组合关系”搞混。组合模式最初只是用于解决树形结构的场景&#xff0c;更多的是处理对象组织结构之间的问题。而组合关系则是通过将不同对象封装起来完成一个统一功能. 1 组合模式介绍 将对象组合成树形结构以表示整个部分的层次结构.组合模式可…

红日靶场复现1

红日靶场复现1&#x1f388;&#x1f388;&#x1f388;&#x1f388;&#x1f389;&#x1f389;&#x1f389;&#x1f389;&#x1f389;&#x1f389;&#x1f388;&#x1f388;&#x1f389;&#x1f388;&#x1f388;&#x1f389; 一、主机发现&#x1f388;&#x1…