Java基础-接口

文章目录

    • 1.快速入门
        • 代码:
        • 结果:
    • 2.接口基本介绍
        • 1.语法
          • 注意:在jdk1.8以后接口才可以有静态方法,默认方法
        • 2.代码实例
    • 3.接口的应用场景
        • 1.场景介绍
        • 2.代码实例
        • 4.接口使用细节
    • 5.接口课堂练习
        • 题目:
        • 答案:
        • 注意:
    • 6.接口和继承的比较
        • 1.代码实现
        • 2.比较
    • 7.接口多态特性
        • 1.接口引用可以指向任何实现了接口的类的对象
        • 2.多态数组
    • 8.接口的多态传递
        • 一个类实现了子接口也就相当于实现了父接口
    • 9.接口课堂练习
        • 题目:
        • 代码:
    • 10.关于Object类型引用指向一个实现了接口的类的情况

1.快速入门

代码:
package interface_;

public class interface01 {
    public static void main(String[] args) {
        new Implements(new Phone()); //使用Implements的构造方法来调用接口,只需要传入实现接口类型的对象就可以
        new Implements(new Computer());
    }
}
//一个Usb接口,可以让手机和电脑实现
interface Usb {
    public void start();
    public void stop();
}
//手机实现接口
class Phone implements Usb{
    @Override
    public void start() {
        System.out.println("手机开始工作");
    }

    @Override
    public void stop() {
        System.out.println("手机停止工作");
    }
}
//电脑实现接口
class Computer implements Usb {
    @Override
    public void start() {
        System.out.println("电脑开始工作");
    }

    @Override
    public void stop() {
        System.out.println("电脑停止工作");
    }
}
//这个类是用来调用接口的
class Implements {
    public Implements(Usb usb) {
        usb.start();
        usb.stop();
    }
}

结果:

image-20231210142936423

2.接口基本介绍

1.语法
interface 接口名 {
	属性
	方法(1.抽象方法 2.默认实现方法 3.静态方法)
}
class 类名 implements 接口 {
	自己属性
	自己方法
	必须实现的接口的抽象方法
}
注意:在jdk1.8以后接口才可以有静态方法,默认方法
2.代码实例
package interface_;

public class Interface02 {
    public static void main(String[] args) {
        A a = new B(); //调用接口
        a.printA();
        A.printB();
        a.abmetnod();
    }
}
interface A {
    int a = 10;
    int b = 20; //属性
    default public void printA() { //默认实现方法
        System.out.println("我是接口A的默认实现方法");
        System.out.println(a);
    }
    public static void printB() { //静态方法
        System.out.println("我是接口A的静态方法");
        System.out.println(b);
    }
    public void abmetnod(); //抽象方法
}
class B implements A {
    @Override
    public void abmetnod() {
        System.out.println("我是被B实现的A接口的抽象方法");
    }
}

image-20231210145533842

3.接口的应用场景

1.场景介绍

定义一个接口,连接数据库,要求分别连接mysql,Oracle两种数据库,这样就可以提现接口的强大

  1. 方法名已经规定好了,体现了规范性
  2. 想要使用哪种方式,就使用那个类来实现接口,实现了统一调用的
2.代码实例
package interface_;

import com.sun.org.apache.xpath.internal.operations.Or;

public class interface03 {
    public static void main(String[] args) {
        print(new Mysql());
        print(new Oracle());
    }
    //静态方法用来统一调用接口
    public static void print(DBconnect dBconnect) {
        dBconnect.connect();
    }
}
interface DBconnect {
    public void connect();
}
class Mysql implements DBconnect {
    @Override
    public void connect() {
        System.out.println("连接mysql数据库");
    }
}
class Oracle implements DBconnect {
    @Override
    public void connect() {
        System.out.println("连接Oracle数据库");
    }
}

image-20231210153459168

4.接口使用细节
  1. 接口不能被实例化
  2. 接口中所有的方法默认都是public abstract
  3. 接口中所有的属性都是public static final,并且必须初始化
  4. 接口中的属性在外部访问最好是 :接口名.属性名
  5. 一个普通类实现接口,就必须将该接口的所有方法都实现,使用alt + Enter
  6. 抽象类实现接口,可以不用实现接口的方法
  7. 一个类可以同时实现多个接口
  8. 接口不能继承其他的类,但是可以继承多个别的接口
  9. 接口的修饰符只能是public 和 默认,这点和类的修饰符是一样的

5.接口课堂练习

题目:

image-20231210155700775

答案:
package interface_;

public class InterfaceExercise01 {
    public static void main(String[] args) {
        BB b = new BB();
        System.out.println(b.a); //可以通过子类引用的方式来访问接口的属性但是不推荐
        System.out.println(AA.a); //使用父类类名访问静态变量 ok
        System.out.println(BB.a); //使用子类类名访问静态变量 ok
    }
}
interface AA {
    int a = 23;
}
class BB implements AA {

}
注意:

子类继承父类,或者子类实现接口,则静态变量就变成两者共享的了,所以,使用子类的类名访问共享的静态变量也是可以的

6.接口和继承的比较

1.代码实现
package interface_;

public class ExtendsVsInterface {
    public static void main(String[] args) {
        littleMonkey littleMonkey = new littleMonkey("悟空");
        littleMonkey.climbing();
        littleMonkey.flying();
        littleMonkey.swiming();
    }
}
class Monkey {
    private String name;

    public Monkey(String name) {
        this.name = name;
    }

    public void climbing() { //猴子类具有的爬树功能
        System.out.println("猴子" + name + "会爬树");
    }
}
//鱼接口
interface Fishable {
    void swiming(); //游泳的功能
}
//鸟接口
interface Birdable {
    void flying(); //鸟的飞翔功能
}

class littleMonkey extends Monkey implements Fishable,Birdable{ //小猴子类继承了猴子类,就继承了猴子类的爬树功能
    public littleMonkey(String name) {
        super(name);
    }
    //小猴子类实现了鱼接口的游泳功能
    @Override
    public void swiming() {
        System.out.println("小猴子会像鱼一样游泳");
    }
    //小猴子实现了鸟接口的飞翔功能
    @Override
    public void flying() {
        System.out.println("小猴子会像鸟一样飞翔");
    }
}

image-20231210163355380

2.比较
  1. 类是单继承多实现的,接口是多继承(只能继承接口)的机制
  2. 当子类继承了父类,则自动拥有父类的功能
  3. 如果子类需要扩展功能,就可以通过实现接口的方式去扩展
  4. 可以理解为:实现接口是对java单继承机制的补充
  5. 接口与继承解决的问题不同
    1. 继承:解决代码的复用性和可维护性
    2. 接口:设计好各种规范(方法),让其他类去实现这些方法
  6. 接口比继承更加灵活
    1. 继承:满足is - a的关系
    2. 接口:满足like - a的关系
  7. 接口在一定程度上实现代码解耦

7.接口多态特性

1.接口引用可以指向任何实现了接口的类的对象
2.多态数组

image-20231210184721623

package interface_;

public class InterfacePolyArr {
    public static void main(String[] args) {
        Usb_[] usb = new Usb_[2]; //接口引用的数组usb指向两个接口引用的空间
        usb[0] = new Phone_();
        usb[1] = new Camera();
        for (int i = 0; i < usb.length; i++) { //遍历两个接口引用,调用两个接口的work方法
            usb[i].work();
            if (usb[i] instanceof Phone_) { //如果接口引用指向Phone_对象则向下转型并调用call方法
                ((Phone_) usb[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("相机正在工作");
    }
}

image-20231210190429051

8.接口的多态传递

一个类实现了子接口也就相当于实现了父接口
package abstract_;

/**
 * 接口的多态传递
 */
public class InterFacePolyPass {
    public static void main(String[] args) {
        IH ih = new Teacher();
        IG ig = new Teacher();
        //一个类实现了子接口也相当于实现了父接口
    }
}
//两个接口,是继承关系
interface IH {
    
}

interface IG extends IH{
    
}
//一个类,实现了子接口
class Teacher implements IG {
        
}

9.接口课堂练习

题目:

image-20231210192555531

代码:
package interface_;

public class InterFaceExercise02 {
    public static void main(String[] args) {
        new C_().pX();
    }
}
interface A_ {
    int x = 0;
}
class B_ {
    int x = 1;
}
class C_ extends B_ implements A_ {
    public void pX(){
//        System.out.println(x); 不能直接输出x,因为这样不知道要找的是哪个x
        System.out.println("接口的x:" + A_.x);
        System.out.println("父类的x:" + super.x);
    }
}

10.关于Object类型引用指向一个实现了接口的类的情况

在java源码中,经常会看到返回的是一个实现了接口的类但是用来接收的却是一个Object类型。这时就发生了Object类型引用指向了一个实现了接口类型的类的情况。

此时这个Object类型的引用:

  1. 既可以被看作是指向了实现了接口的类的类型
  2. 也可以看作是指向了这个接口的类型
  3. 根据向下转型的定义,既可以将这个引用转换成接口类型也可以将这个引用转换成实现了接口的类的类型
  4. 当将这个引用转换成接口类型的时候,就是一个接口类型的引用指向一个实现了接口的类的类型,就是一个向上转型,此时这个引用只能使用接口的属性和方法
  5. 当将这个引用转换成实现接口的类的类型时,就是变成了一个实现了接口的类的引用,可以调用这个类的所有属性和方法

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【快速上手QT】08-Buttons组件

我们差不多把QT的基础部分讲差不多了。接下来我们把一些组件介绍一下&#xff0c;最后再开始QT的进阶部分&#xff0c;需要先把基础打牢嘛&#xff0c;也当是练习练习怎么使用QT助手了。 就按照QtDesigner里的顺序&#xff0c;今天我们讲一讲Buttons&#xff0c;也就是按钮组件…

Linux命令深入学习——列出帮助手册,开机关机

linux中有多种方法查看一个不熟悉命令的详细信息&#xff0c;如 ls --help&#xff0c;help ls&#xff0c;man ls&#xff0c;info ls 在linux系统中可以使用命令进行开关机以及相关基础操作 同时在进行写入操作时&#xff0c;可以使用快捷键进行操作

微信小程序(一)

WebView app.是全局配置&#xff0c;app.json是全局配置文件&#xff0c;在页面的.json配置文件中的配置会覆盖我们全局的配置 快捷键&#xff1a; .box 敲回车 ----- <view class"box"></view> .row*8 敲回车&#xff1a; .row{$}*8 敲回车 案例1&…

深入浅出Java泛型

公众号「稀有猿诉」 原文链接 深入浅出Java泛型 温故而知新&#xff0c;可以为师矣&#xff01; 在前面的一篇文章中学习了Kotlin的泛型知识&#xff0c;但总感觉还不够深入&#xff0c;因为一些深入的话题和高级的特性并未有讲清楚。但在继续深入之前还是有必要重温一下…

吴恩达深度学习笔记:神经网络的编程基础2.5-2.8

目录 第一门课&#xff1a;神经网络和深度学习 (Neural Networks and Deep Learning)第二周&#xff1a;神经网络的编程基础 (Basics of Neural Network programming)2.5 导数&#xff08;Derivatives&#xff09; 第一门课&#xff1a;神经网络和深度学习 (Neural Networks an…

04-微服务 面试题

目录 1.Spring Cloud 常见的组件有哪些? 2.服务注册和发现是什么意思?(Spring Cloud 如何实现服务注册发现) 3.你们项目负载均衡如何实现的 ? 4.什么是服务雪崩,怎么解决这个问题? 5.你们服务是怎么监控的? 6.微服务限流(漏桶算法、令牌桶算法) 7.解释一下CAP…

scrapy的基本使用介绍

创建项目 ### 1. 创建虚拟环境 conda create -n spiderScrapy python3.9 ### 2. 安装scrapy pip install scrapy2.8.0 -i https://pypi.tuna.tsinghua.edu.cn/simple### 3. 生成一个框架 scrapy startproject my_spider### 4. 生成项目 scrapy genspider baidu https://www.b…

RabbitMQ - 02 - 基本消息模型

目录 部署demo项目 什么是基本消息模型 实现基本消息模型 部署demo项目 首先配置好一个mq的练习demo,并配置好相关依赖 链接&#xff1a;https://pan.baidu.com/s/1oXAqgoz9Y_5V7YxC_rLa-Q?pwdv2sg 提取码&#xff1a;v2sg 如图 父xml文件已经配置好了 AMQP依赖了 什么…

重学SpringBoot3-集成Thymeleaf

更多SpringBoot3内容请关注我的专栏&#xff1a;《SpringBoot3》 重学SpringBoot3-集成Thymeleaf 1. 添加Thymeleaf依赖2. 配置Thymeleaf属性&#xff08;可选&#xff09;3. 创建Thymeleaf模板4. 创建一个Controller5. 运行应用并访问页面Thymeleaf基本语法小技巧 国际化步骤 …

Cassandra 安装部署

文章目录 一、概述1.官方文档2. 克隆服务器3.安装准备3.1.安装 JDK 113.2.安装 Python3.3.下载文件 二、安装部署1.配置 Cassandra2.启动 Cassandra3.关闭Cassandra4.查看状态5.客户端连接服务器6.服务运行脚本 开源中间件 # Cassandrahttps://iothub.org.cn/docs/middleware/…

15. UE5 RPG获取GE应用的回调,并根据Tag设置数据显示到窗口

在上一篇介绍了对标签如何在项目中设置&#xff0c;这一篇先讲解一下如何在GE里面使用GameplayTag标签。 之前我在第十一章节中 11. UE5 RPG使用GameplayEffect修改角色属性&#xff08;二&#xff09;介绍了一些GE的属性&#xff0c;在UE 5.3版本中&#xff0c;修改的配置方式…

SpringBoot中MD5使用

SpringBoot中MD5使用 新建md5类 public final class MD5 {public static String encrypt(String strSrc) {try {char[] hexChars {0, 1, 2, 3, 4, 5, 6, 7, 8,9, a, b, c, d, e, f};byte[] bytes strSrc.getBytes();MessageDigest md MessageDigest.getInstance("MD5…

云游戏发行是什么?云游戏发行的演进历程

云游戏发行是一系列基于云游戏技术的游戏发行策略或行为&#xff0c;融合云试玩、云微端、可玩广告、跨端移植等技术&#xff0c;从而在传统游戏发行生态的基础上实现更为卓越的发行效果。 云游戏发行出现的原因 近年来&#xff0c;游戏市场出现负增长。其原因一方面在于游戏版…

高颜值抓包工具Charles,实现Mac和IOS端抓取https请求

Hi&#xff0c;大家好。在进行测试的过程中&#xff0c;不可避免的会有程序报错&#xff0c;为了能更快修复掉Bug&#xff0c;我们作为测试人员需要给开发人员提供更准确的报错信息或者接口地址&#xff0c;这个时候就需要用到我们的抓包工具。 常见的抓包工具有Fiddler、Char…

LeetCode_Java_二叉搜索树系列(题目+思路+代码)

目录 108.将有序数组转化为二叉搜索树 109.有序链表转换二叉搜索树 876.链表的中间节点 108.将有序数组转化为二叉搜索树 给你一个整数数组 nums &#xff0c;其中元素已经按 升序 排列&#xff0c;请你将其转换为一棵 平衡二叉搜索树。 示例 1&#xff1a; 输入&#xf…

vscode使用svn

网上这种文章很多&#xff0c;但很多都实现不了&#xff0c;自己亲测安装有效的过程记录下来&#xff0c;分享给大家。 第一步&#xff1a;去官网下载svn.安装TortoiseSVN 下载地址 下载的地址&#xff1a; Apache Subversion Binary Packageshttps://subversion.apache.or…

OpenHarmony教程指南—ArkTS时钟

简单时钟 介绍 本示例通过使用ohos.display 接口以及Canvas组件来实现一个简单的时钟应用。 效果预览 使用说明 1.界面通过setInterval实现周期性实时刷新时间&#xff0c;使用Canvas绘制时钟&#xff0c;指针旋转角度通过计算得出。 例如&#xff1a;"2 * Math.PI /…

linux ,Windows部署

Linux部署 准备好虚拟机 连接好查看版本&#xff1a;java -version安装jdk 解压命令&#xff1a;tar -zxvf 加jdk的压缩文件名cd /etc 在编辑vim profile文件 在最底下写入&#xff1a; export JAVA_HOME/root/soft/jdk1.8.0_151&#xff08;跟自己的jdk保持一致&#xff0…

【网站项目】012医院住院管理系统

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

C++_异常

目录 1、异常的关键字 2、异常的写法 3、异常的使用规则 3.1 规则1 3.2 规则2 3.3 规则3 3.4 规则4 3.5 规则5 4、异常的重新抛出 5、异常的规范 5.1 C98的异常规范 5.2 C11的异常规范 6、C标准库的异常体系 7、异常的优缺点 结语 前言&#xff1a; C的异常…