Java基础-接口

news2024/11/16 3:49:29

文章目录

    • 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. 当将这个引用转换成实现接口的类的类型时,就是变成了一个实现了接口的类的引用,可以调用这个类的所有属性和方法

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

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

相关文章

深入理解,java标识符?类型转换?

1、标识符 下面这张图是中国的一些姓氏 中国人起名字的规则都是以姓开头&#xff0c;名结尾。通过这个规则可以起&#xff1a;刘爱国、张三等&#xff0c;都是以汉字起的。但是不会起李ad、王123等名字&#xff0c;因为不符合规则。 所以&#xff0c;java在给变量、方法、类等…

【C++进阶】C++继承概念详解

C继承详解 一&#xff0c;继承的概念和定义1.1 继承的概念1.2 继承的定义1.3 继承关系和访问限定符 二&#xff0c;基类和派生类的对象赋值转移三&#xff0c;继承的作用域四&#xff0c;派生类的默认成员函数五&#xff0c;继承和友元&静态成员和继承六&#xff0c;菱形继…

Ansys Lumerical | 激光雷达天线仿真

附件下载 联系工作人员获取附件 在本文中&#xff0c;我们将了解如何根据激光雷达应用需求设计和优化相控阵光栅天线。 概述 激光雷达&#xff08;LIDAR&#xff09;是“light detection and ranging”的简称&#xff0c;近年来由于在机器人、自动驾驶汽车、高精度测绘等领域…

【AcWing】蓝桥杯集训每日一题Day2|前缀和|562.壁画(C++)

562. 壁画 562. 壁画 - AcWing题库难度&#xff1a;中等时/空限制&#xff1a;1s / 64MB总通过数&#xff1a;4154总尝试数&#xff1a;10197来源&#xff1a;Google Kickstart2018 Round H Problem B算法标签 思维题枚举前缀和 题目内容 Thanh 想在一面被均分为 N 段的墙上画…

[java——基础] 双亲委派机制

目录 核心思想&#xff1a; 双亲委派机制的好处&#xff1a; 三种类加载器 解析源代码 双亲委派思想面试总结&#xff1a; 核心思想&#xff1a; 向上搜索&#xff0c;向下加载。 双亲委派机制的好处&#xff1a; 防止Java核心类被篡改&#xff0c;防止类的重复加载。 三…

哈希表|15.三数之和

力扣题目链接 int cmp(const void *a,const void *b) {return *(int*)a - *(int*)b;} int** threeSum(int* nums, int numsSize, int* returnSize, int** returnColumnSizes) {*returnSize 0;if(numsSize < 3)return NULL;qsort(nums, numsSize, sizeof(int),cmp);int **…

C++ Qt开发:QNetworkAccessManager网络接口组件

Qt 是一个跨平台C图形界面开发库&#xff0c;利用Qt可以快速开发跨平台窗体应用程序&#xff0c;在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置&#xff0c;实现图形化开发极大的方便了开发效率&#xff0c;本章将重点介绍如何运用QNetworkAccessManager组件实现Web网…

Java日志框架Log4j 2详解

目录 一、什么是日志&#xff1f; 二、日志的主要用途 三、常用日志框架 1、Apache Log4j 2、Commons Logging 3、SLF4J 4、Logback 5、JUL(Java Util Logging) 6、Log4j 2 四、log4j 2 的优点 五、Log4j 2下载和配置 1、访问Log4j – 下载 Apache Log4j™ 2官网&a…

RHEL9 DNF/YUM仓库管理软件包

DNF/YUM仓库管理软件包 一个基于RPM包的软件包管理器能够从指定的服务器自动下载RPM包并且安装&#xff0c;自动处理依赖性关系&#xff0c;并且一次性安装所有依赖的软件包C/S模式 Server服务端提供RPM软件包与数据库文件repodataClient客户端使用dnf仓库 常用组合 组合参…

你还可以通过“nrm”工具,来自由管理“npm”的镜像

你还可以通过“nrm”工具&#xff0c;来自由管理“npm”的镜像 nrm&#xff08;npm registry manager&#xff09;是npm的镜像管理工具&#xff0c;有时候国外的资源太慢&#xff0c;使用这个就可以快速地在npm源间切换。 1.安装nrm 在命令行执行命令&#xff0c;npm install…

Java 容器启动执行指定任务

1、实现CommandLineRunner接口 实现CommandLineRunner接口&#xff0c;注意做初始化任务的类需要放在扫描路径下&#xff0c;使用Component注入到spring容器中。 import com.zw.service.StudentService; import org.springframework.beans.factory.annotation.Autowired; impo…

网络安全AI智能体公司「云起无垠」获数千万元天使+轮融资,致力于大模型与网络安全深度融合的技术研究

「云起无垠」致力于打造最懂安全的AI智能体&#xff0c;通过持续运营的工具、知识以及记忆引擎&#xff0c;不断提升智能体对用户安全场景的理解&#xff0c;以达到易于使用、自我学习、自主行动的特性&#xff0c;助力企业自动化执行各类安全任务&#xff0c;让软件更安全&…

在WSL2中安装多个Ubuntu教程

文章目录 前言一、前期准备1、WSL安装2、Docker安装 二、安装第二个Ubuntu系统1.切换为WSL22.获取Ubuntu16.04的tar文件从容器中导出tar 3. 将tar文件导入WSL4. 设置默认用户 总结 前言 适用于 Linux 的 Windows 子系统 (WSL) 是 Windows 的一项功能&#xff0c;可用于在 Wind…

H12-811_19

19.(多选题)如下图所示的网络&#xff0c;下列哪些命令可以使RouterA可以转发目的IP地址为10.0.3.3的效据包? A.ip route-static 10.0.3.3 255.255.255.255 10.0.12.2 B.ip route-static 10.0.2.2 255.255.255.255 10.0.12.2 ip route-static 10.0.3.3 255.255.255.255 10.0…

7、设计模式之桥接模式(Bridge)

一、什么是桥接模式 桥接模式是一种结构型设计模式。它将抽象部分和实现部分分离&#xff0c;使它们可以独立地变化。 二、角色组成 抽象部分&#xff08;Abstraction&#xff09;&#xff1a;定义了抽象部分的接口&#xff0c;并包含对实现部分的引用。 实现部分&#xff08;…

GPU技术文档汇总

GPU 进阶笔记&#xff08;二&#xff09;&#xff1a;华为昇腾 910B GPU 相关&#xff08;2023&#xff09;https://arthurchiao.art/blog/gpu-advanced-notes-2-zh/

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的铁轨缺陷检测系统(Python+PySide6界面+训练代码)

摘要&#xff1a;开发铁轨缺陷检测系统对于物流行业、制造业具有重要作用。本篇博客详细介绍了如何运用深度学习构建一个铁轨缺陷检测系统&#xff0c;并提供了完整的实现代码。该系统基于强大的YOLOv8算法&#xff0c;并对比了YOLOv7、YOLOv6、YOLOv5&#xff0c;展示了不同模…

做嵌入式编程,为什么用的是C语言而不是C++呢?

做嵌入式编程&#xff0c;为什么用的是C语言而不是C呢&#xff1f; 在开始前我分享下我的经历&#xff0c;我刚入行时遇到一个好公司和师父&#xff0c;给了我机会&#xff0c;一年时间从3k薪资涨到18k的&#xff0c; 我师父给了一些 电气工程师学习方法和资料&#xff0c;让我…

【阿里云系列】-如何实现两个VPC网络资源互通

背景 由于实际项目预算有限&#xff0c;两套环境虽然分别属于不同的专有网络即不同的VPC&#xff0c;但是希望借助一台运维机器实现对两个环境的监控和日常的运维操作 网络架构 如下是需要实现的外网架构图&#xff0c;其中希望实现UAT环境的一台windows的堡垒机可以访问生产…

光学硬件——二向色片

二向色镜&#xff08;Dichroic Mirrors &#xff09;又称双色镜&#xff0c;常用于激光技术中。 产品介绍&#xff1a; 指45度入射或大角度入射时&#xff0c;把光源分离出特定的光谱改变部分光谱光路方向&#xff0c;常用于酶标仪器、荧光显微镜系统、投影光引擎系统、激光灯…