Java-接口

目录

1.接口的概念

2.语法规则

3.接口使用

4.接口特性

5.实现多个接口

6.接口间的继承

7.接口使用实例


1.接口的概念

        

         电脑的USB口上,可以插:U盘、鼠标、键盘等所有符合USB协议的设备;数据线的type-c口上,可以插手机,蓝牙耳机充电盒等所有符合规范的设备。由此可以看出:接口就是公共行为的规范表准,在使用时,只要符合规范就可以使用,在Java中,接口可以看成是多个类的公共规范,是一种引用数据类型

2.语法规则

        接口的定义格式与定义类的格式基本相同,将class关键字换成 interface 关键字,就定义了一个接口。

public interface 接口名{

        //抽象方法

        public abstract void method1(); //在接口中public abstract是固定搭配,可以省略不写         public void method2();

        abstract void method3();

        void method4();   //以上几种定义方法的方式都可以

}

        提示:创建接口时,一般以大写字母I开头来命名,命名一般用“形容词”词性的单词,接口中的方法和属性不要加任何修饰符号,保持代码简洁

3.接口使用

        接口不能直接使用,必须要有一个"实现类"来"实现"该接口,实现接口中的所有抽象方法。

public class 类名 implements 接口名{

        //...

}

        注意:子类和父类之间是extends 继承关系,类与接口之间是 implements 实现关系

请实现笔记本电脑使用USB鼠标、USB键盘的例子
1. USB接口:包含打开设备、关闭设备功能
2. 笔记本类:包含开机功能、关机功能、使用USB设备功能
3. 鼠标类:实现USB接口,并具备点击功能
4. 键盘类:实现USB接口,并具备输入功能
 

//USB接口
public interface USB {//打开设备void openDevicce();//关闭设备void offDevicce();
}
//鼠标类,实现USB接口
public class Mouse implements USB{@Overridepublic void openDevicce() {System.out.println("连接鼠标设备成功");}@Overridepublic void offDevicce() {System.out.println("鼠标设备断开连接");}//鼠标点击public void click(){System.out.println("鼠标点击成功~");}
}
//键盘类,实现USB接口
public class KeyBoard implements USB{@Overridepublic void openDevicce() {System.out.println("连接键盘设备成功");}@Overridepublic void offDevicce() {System.out.println("键盘设备断开连接");}//输入功能public void input(){System.out.println("键盘输入");}
}
//电脑类,
public class Computer {//开机public void openComputer(){System.out.println("打开电脑");}//关机public void offComputer(){System.out.println("关闭电脑");}//使用USB接口设备public void useDevicce(USB usb){usb.openDevicce();if (usb instanceof Mouse){Mouse mouse= (Mouse)usb;mouse.click();}if (usb instanceof KeyBoard){KeyBoard keyBoard=(KeyBoard)usb;keyBoard.input();}usb.offDevicce();}
}

//测试类

public class Text {public static void main(String[] args) {//实例化电脑Computer computer=new Computer();//打开电脑computer.openComputer();System.out.println("====");//使用鼠标设备computer.useDevicce(new Mouse());System.out.println("====");//使用键盘设备computer.useDevicce(new KeyBoard());//关闭电脑computer.offComputer();}}

4.接口特性

        1. 接口类型是一种引用类型,但不能直接new接口的对象

public class TestUSB {
        public static void main(String[] args) {
                USB usb = new USB();
        }
}  //编译报错,USB是抽象类型,无法实例化

        2.接口中每一个方法都是public的抽象方法, 即接口中的方法会被隐式的指定为 public abstract(只能是public abstract,其他修饰符都会报错)。

public interface USB {
        private void openDevice(); // 编译 报错,不允许使用修饰符private
        void closeDevice();
}

        3.接口中的方法是不能在接口中实现的,只能由实现接口的类来实现

public interface USB {
       void openDevice();
         void closeDevice(){
                System.out.println("关闭USB设备");
         }// 编译报错,因为接口中的方法默认为抽象方法,不能带有方法体
}

        4. 重写接口中方法时,不能使用默认的访问权限

public interface USB {

        //打开设备

        void openDevicce();

        //关闭设备

        void offDevicce();

}

public class Mouse implements USB{

        @Override

        void openDevicce() {

        System.out.println("连接鼠标设备成功");

}        //编译报错,重写时不能使用默认修饰符

        5. 接口中可以含有变量,但是接口中的变量会被隐式的指定为 public static final 变量

public interface USB {int a=1;//默认被 final public static 修饰//打开设备void openDevicce();//关闭设备void offDevicce();
}
public class Text {public static void main(String[] args) {System.out.println(USB.a); //可以通过接口访问,说明是静态的System.out.println(a); //可以直接访问,说明是公开的USB a=10; //编译报错,说明a具有final属性}
}

        6. 接口中不能有静态、动态代码块和构造方法。

public interface USB {
        public USB(){


        } //编译报错

        {
        } // 编译报错

        static{

        }  //编译报错
        void openDevice();
        void offDevice();
}

        7. 接口虽然不是类,但接口编译完成后字节码文件的后缀格式也是.class
        8. 如果类没有实现接口中的所有抽象方法,则类必须设为抽象类

        9.jdk8中:接口中还可以包含default方法

5.实现多个接口

        在Java中,类和类之间是单继承的,一个类只能有一个父类,即Java中不支持多继承,但是一个类可以实现多个接口。下面通过类来表示一组动物。

//动物类
public class Animals {protected String name;protected int age;public Animals(String name, int age) {this.name = name;this.age = age;}
}

        有的动物会飞,有的动物会跑,有的动物会游泳,还有的动物可能有这三种中的多种,可以设为接口。

//接口,分别表示会飞的、会跑的、会游泳的
interface Flying{void fly();
}
interface Running{void running();
}interface Swimming{void swimming();
}

        下面创建具体的动物。

        猫,是一种会跑的动物。

//猫类
public class Cats extends Animals implements Running{public Cats(String name, int age) {super(name, age);}@Overridepublic void running() {System.out.println(this.name+"用四只腿跑~");}
}

        鱼,是一种会游的动物。

public class Fish extends Animals implements Swimming{public Fish(String name, int age) {super(name, age);}@Overridepublic void swimming() {System.out.println(this.name+"用尾巴游泳");}
}

        青蛙,是一种既能跑又能游的两栖动物。

//青蛙类
public class Frog extends Animals implements Running,Swimming{public Frog(String name, int age) {super(name, age);}@Overridepublic void running() {System.out.println(this.name+"可以用两只脚跳");}@Overridepublic void swimming() {System.out.println(this.name+"可以用两只脚两只手游");}
}

           注意:一个类实现多个接口时,每个接口中的抽象方法都要实现,否则类必须设置为抽象类。(IDEA 中使用 ctrl + i 快速实现接口)

        鸭子,是一种海陆空三栖动物,既可以跑又可以游还能飞。

//鸭子类
public class Duck extends Animals implements Flying,Running,Swimming{public Duck(String name, int age) {super(name, age);}@Overridepublic void fly() {System.out.println(this.name+"可以用两个翅膀飞");}@Overridepublic void running() {System.out.println(this.name+"可以两只脚跑");}@Overridepublic void swimming() {System.out.println(this.name+"可以用两只脚和两个翅膀游");}
}
//测试
public class text {public static void main(String[] args) {Cats cat=new Cats("小猫",5);cat.running();System.out.println("====");Fish fish=new Fish("小鱼",2);fish.swimming();System.out.println("====");Frog frog=new Frog("小青蛙",3);frog.running();frog.swimming();System.out.println("====");Duck duck=new Duck("小鸭子",6);duck.fly();duck.running();duck.swimming();}
}

        上面的代码展示了 Java 面向对象编程中最常见的用法: 一个类继承一个父类, 同时实现多种接口。继承表达的含义是 is - a 语义, 而接口表达的含义是 具有 xxx 特性。如上述的猫,是一种动物,具有跑的特性;鱼,是一种动物,具有在水中游的特性等等。

6.接口间的继承

        在Java中,类和类之间是单继承的,一个类可以实现多个接口,接口与接口之间可以多继承。即:用接口可以达到多继承的目的。接口可以继承一个接口, 达到复用的效果. 使用 extends 关键字。
        例如

//接口,表示跑
interface Running{void run();
}
//接口,表示游
interface Swimming{void swimming();
}
//接口,表示两栖动物(既能跑又能游),这里extends表示拓展
interface Amphibious extends Running,Swimming{}
//青蛙类
class Frog  implements Amphibious{//...
}​​​​​

        此时实现接口创建的 Frog 类, 就继续要实现 run 方法, 也需要实现 swim 方法。接口间的继承相当于把多个接口合并在一起

7.接口使用实例

        给对象数组排序

public class Students {private String name;private int age;public Students(String name, int age) {this.name = name;this.age = age;}@Overridepublic String toString() {return "Students{" +"name='" + name + '\'' +", age=" + age +'}';}}

        定义一个学生数组对象并对数组中的元素进行排序

Students[] students=new Students[3];
students[0]=new Students("张三",15);
students[1]=new Students("李四",10);
students[2]=new Students("王五",30);

        ,之前我们学过,数组自带有排序方法,是否可以直接使用这个方法呢?

Arrays.sort(students);
System.out.println(Arrays.toString(students));

         我们会发现,编译通过,但运行报错。仔细一想,之前数组中每一个元素是整数,可以直接比较大小,而在这里,数组中的元素为一个个的学生,而两个学生的大小关系无法确定,需要我们额外指定比较方式。

        让我们的 Students 类实现 Comparable 接口, 并实现其中的 compareTo 方法

public class Students implements Comparable(也可以写成Comparable<T>,T表示要比较的数据类型) {              //表示当前的类是可以比较的private String name;private int age;public Students(String name, int age) {this.name = name;this.age = age;}@Overridepublic String toString() {return  "{"+"name=" + name +", age=" + age+"}";}//重写字符串比较函数@Override              //Object类型的变量opublic int compareTo(Object o) {Students s=(Students)o;//强制类型转换/*if(this.age>s.age){return 1;} else if (this.age<s.age) {return -1;}else {return 0;}*/return this.age-s.age;}
}

        在 sort 方法中会自动调用 compareTo 方法. compareTo 的参数是 Object , 其实传入的就是 Student 类型的对象 。然后比较当前对象和参数对象的大小关系(按年龄计算):如果当前对象应排在参数对象之前, 返回小于 0 的数字;如果当前对象应排在参数对象之后, 返回大于 0 的数字;如果当前对象和参数对象不分先后, 返回 0;

import java.util.Arrays;
public class Text {public static void main(String[] args) {Students[] students=new Students[3];students[0]=new Students("张三",15);students[1]=new Students("李四",10);students[2]=new Students("王五",30);Arrays.sort(students);System.out.println(Arrays.toString(students));}
}

         注意:对于 sort 方法来说, 需要传入的数组的每个对象都是 "可比较" 的, 需要具备 compareTo 这样的能力. 通过重写 compareTo 方法的方式, 就可以定义比较规则。这种对类的入侵性比较强,一旦写好规定的比较方式,那么以后只能以这种方式比较。

        第二种方式,构造比较器类

public class Students {public String name;public int age;public Students(String name, int age) {this.name = name;this.age = age;}@Overridepublic String toString() {return "{" +"name=" + name +", age=" + age +"}";}
}
//比较器
class ageComparator implements Comparator<Students> {@Overridepublic int compare(Students o1,Students o2) {return o1.age- o2.age;}
}
class nameComparator implements Comparator<Students>{@Overridepublic int compare(Students o1, Students o2) {//String 自己重写compareTo 方法return o1.name.compareTo(o2.name);}
}
public class Text {public static void main(String[] args) {Students[] students=new Students[3];students[0]=new Students("zhangsan",15);students[1]=new Students("lisi",10);ageComparator ageComparator1=new ageComparator();System.out.println(ageComparator1.compare(students[0],students[1]));System.out.println("=====");nameComparator nameComparator1=new nameComparator();System.out.println(nameComparator1.compare(students[0],students[1]));}
}

 

        注意:这种方式做到灵活比较,只需传两个对象即可。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring源码篇(九)自动配置扫描class的原理

文章目录 前言ClassLoader如何加载jar包里的class自动配置扫描class的原理spring中的加载方式源码总结 前言 spring是怎样通过ComponentScan&#xff0c;或者自动配置扫描到了依赖包里class的&#xff1f; ClassLoader 这里涉及到了class Loader的机制&#xff0c;有些复杂&…

Unity Image(RawImage) 实现按轴心放大缩小,序列化存储轴心信息,实现编译器窗口保存轴心

工作时分配给我的要实现的功能&#xff0c;写的时候遇到挺多的坑的&#xff0c;在此记录一下 效果 放大缩小的效果 2.编译器扩展窗口记录 实现点 1.Json序列化存储图片轴心位置, 放大倍率&#xff0c;放大所需要的事件 2.用了编译器扩展工具便于保存轴心信息坑点 1.Imag…

飞桨AI Studio可以玩多模态了?MiniGPT4实战演练!

MiniGPT4是基于GPT3的改进版本&#xff0c;它的参数量比GPT3少了一个数量级&#xff0c;但是在多项自然语言处理任务上的表现却不逊于GPT3。项目作者以MiniGPT4-7B作为实战演练项目。 创作者&#xff1a;衍哲 体验链接&#xff1a; https://aistudio.baidu.com/aistudio/proj…

前端如何打开钉钉(如何唤起注册表中路径与软件路径不关联的软件)

在前端唤起本地应用时&#xff0c;我查询了资料&#xff0c;在注册表中找到腾讯视频会议的注册表情况&#xff0c;如下&#xff1a; 在前端代码中加入 window.location.href"wemeet:"; 就可以直接唤起腾讯视频会议&#xff0c;但是我无法唤起钉钉 之所以会这样&…

leetcode每日一题Day2——344. 反转字符串

✨博主&#xff1a;命运之光 &#x1f984;专栏&#xff1a;算法修炼之练气篇&#xff08;C\C版&#xff09; &#x1f353;专栏&#xff1a;算法修炼之筑基篇&#xff08;C\C版&#xff09; &#x1f433;专栏&#xff1a;算法修炼之练气篇&#xff08;Python版&#xff09; …

【css】css实现一个简单的按钮

四种链接状态分别是&#xff1a; a:link - 正常的&#xff0c;未访问的链接a:visited - 用户访问过的链接a:hover - 用户将鼠标悬停在链接上时a:active - 链接被点击时 <style> a:link, a:visited {//未访问、访问过background-color: #07c160;//设置背景颜色color: wh…

【ASP.NET MVC】使用动软(五)(13)

一、问题 前文完成的用户登录后的首页如下&#xff1a; 后续账单管理、人员管理等功能页面都有相同的头部&#xff0c;左边和下边&#xff0c;唯一不同的右边内容部分&#xff0c;所以要解决重复设计的问题。 二、解决方法——使用布局页 在Views上右键添加新建项&#xff…

基于量子同态加密的改进多方量子私有比较

摘要量子同态加密在隐私保护方面具有明显的优势。本文提出了一种改进的基于量子同态加密的多方量子私钥比较协议。首先&#xff0c;引入可信密钥中心&#xff0c;安全辅助加密密钥的分发和解密密钥的更新&#xff0c;同时防止恶意服务器发布虚假结果的攻击;在保证所有参与者得到…

RPC原理与Go RPC详解

文章目录 RPC原理与Go RPC什么是RPC本地调用RPC调用HTTP调用RESTful API net/rpc基础RPC示例基于TCP协议的RPC使用JSON协议的RPCPython调用RPC RPC原理 RPC原理与Go RPC 什么是RPC RPC&#xff08;Remote Procedure Call&#xff09;&#xff0c;即远程过程调用。它允许像调用…

Spring Boot 配置多数据源【最简单的方式】

Druid连接池 Spring Boot 配置多数据源【最简单的方式】 文章目录 Druid连接池 Spring Boot 配置多数据源【最简单的方式】 0.前言1.基础介绍2.步骤2.1. 引入依赖2.2. 配置文件2.3. 核心源码Druid数据源创建器Druid配置项 DruidConfig 3.示例项目3.1. pom3.1.1. 依赖版本定义3.…

matlab使用教程(8)—绘制三维曲面图

1网格图和曲面图 MATLAB 在 x-y 平面中的网格上方使用点的 z 坐标来定义曲面图&#xff0c;并使用直线连接相邻的点。mesh 和surf 函数以三维形式显示曲面图。 • mesh 生成仅使用颜色来标记连接定义点的线条的线框曲面图。 • surf 使用颜色显示曲面图的连接线和面。 MATL…

网络安全 Day26-PHP 简单学习

PHP 简单学习 1. 为什么要学习PHP2. PHP语法3. php 变量4. 字符串数据5. PHP 函数6. 数组 1. 为什么要学习PHP php存量多开源软件多很多安全流程 渗透方法 sql注入基于PHP语言入门简单 2. PHP语法 格式: <?php 内容?>或<?内容?>结尾分号例子<?php phpin…

深度学习实践——循环神经网络实践

系列实验 深度学习实践——卷积神经网络实践&#xff1a;裂缝识别 深度学习实践——循环神经网络实践 深度学习实践——模型部署优化实践 深度学习实践——模型推理优化练习 代码可见于&#xff1a;https://download.csdn.net/download/weixin_51735061/88131380?spm1001.201…

【Linux】进程间通信——管道

目录 写在前面的话 什么是进程间通信 为什么要进行进程间通信 进程间通信的本质理解 进程间通信的方式 管道 System V IPC POSIX IPC 管道 什么是管道 匿名管道 什么是匿名管道 匿名管道通信的原理 pipe()的使用 匿名管道通信的特点 拓展代码 命名管道 什么是命…

ChatGPT结合知识图谱构建医疗问答应用 (二) - 构建问答流程

一、ChatGPT结合知识图谱 上篇文章对医疗数据集进行了整理&#xff0c;并写入了知识图谱中&#xff0c;本篇文章将结合 ChatGPT 构建基于知识图谱的问答应用。 下面是上篇文章的地址&#xff1a; ChatGPT结合知识图谱构建医疗问答应用 (一) - 构建知识图谱 这里实现问答的流程…

备忘录模式——撤销功能的实现

1、简介 1.1、概述 备忘录模式提供了一种状态恢复的实现机制&#xff0c;使得用户可以方便地回到一个特定的历史步骤。当新的状态无效或者存在问题时&#xff0c;可以使用暂时存储起来的备忘录将状态复原。当前很多软件都提供了撤销&#xff08;Undo&#xff09;操作&#xf…

Spring AOP

1.什么是 Spring AOP&#xff1f; AOP&#xff08;Aspect Oriented Programming&#xff09;&#xff1a;面向切面编程&#xff0c;它是⼀种思想&#xff0c;它是对某⼀类事情的集中处理。⽐如⽤户登录权限的效验&#xff0c;没学 AOP 之前&#xff0c;我们所有需要判断⽤户登…

ClickHouse(七):Clickhouse数据类型-2

进入正文前&#xff0c;感谢宝子们订阅专题、点赞、评论、收藏&#xff01;关注IT贫道&#xff0c;获取高质量博客内容&#xff01; &#x1f3e1;个人主页&#xff1a;含各种IT体系技术&#xff0c;IT贫道_Apache Doris,Kerberos安全认证,大数据OLAP体系技术栈-CSDN博客 &…

openlayers渲染rgb三波段cog时达到类似rgba的效果(去掉黑底)

图是arcgis渲染成rgb的&#xff0c;由于没有透明度波段&#xff0c;底下是黑的。 为了能在前端显示透明效果&#xff0c;之前是用python处理数据&#xff0c;给它加个透明度波段 后来研究了一下ol的样式表达式&#xff0c;可以直接在前端去掉黑底 样式设置代码如下 const s…

Socks IP轮换:为什么是数据挖掘和Web爬取的最佳选择?

在数据挖掘和Web爬取的过程中&#xff0c;IP轮换是一个非常重要的概念。数据挖掘和Web爬取需要从多个网站或来源获取数据&#xff0c;而这些网站通常会对来自同一IP地址的请求进行限制或封锁。为了避免这些问题&#xff0c;数据挖掘和Web爬取过程中需要使用Socks IP轮换技术。在…