Java语言程序设计——篇十(1)

在这里插入图片描述

     🌿🌿🌿跟随博主脚步,从这里开始→博主主页🌿🌿🌿

接口介绍

  • 接口
    • 概述
    • 接口定义
    • 接口的实现
      • 实战演练
    • 👅接口的继承
      • 实战演练
      • 实战演练
    • 接口的类型
    • 常量
      • 实战演练
    • 静态方法
    • 默认方法
      • 解决默认方法冲突
      • 实战演练

接口

概述

Java语言中所有的类都处于一个类层次结构中。
除Object类以外,所有类都只有一个直接父类,即子类与父类之间是单继承的关系,但不允许多重继承。
为了实现多重继承,java语言通过接口使得处于不同层次、甚至互不相关的类具有相同的行为。

接口定义

  • 接口定义了一种可以被类层次中任何类实现的行为的协议
  • 接口是常量、抽象方法、默认方法和静态方法的集合体
  • 接口可以实现多重继承
  • 接口声明使用interface关键字
  • 接口定义,包含接口声明和接口体两部分
[public或者省略] interface 接口名称 [extends 父接口名列表]{[public][static][final] 数据类型 成员变量名=常量;……[public][abstract] 返回值的数据类型 方法名(参数表);……[public] static 返回值的数据类型 方法名(参数表){方法体}……[public] default 返回值的数据类型 方法名(参数表){方法体}……}

例:

 public interface Eatable {接口被看作是一种特殊的类型。每个接口都被编译为独立的字节码文件。//抽象方法public abstract String howtoEat();
}

接口与抽象类相似:
   接口可以作为引用变量数据类型或类型转换的结果;
   接口与抽象类一样,不能用new运算符创建接口实例。
接口的抽象方法只有声明,没有实现。
抽象方法也可以省略修饰符,省略修饰符编译器自动加上public、abstract。
在这里插入图片描述
                 在这里插入图片描述

在这里插入图片描述

  • 接口的UML表示
    在这里插入图片描述
  • 接口通常表示某种能力,因此接口名后缀通常是able。

接口的实现

接口的实现:利用接口的特性来建造类的过程。类似于继承,但不是extends,而是使用implements。
接口实现的语法格式:

       class  类名称  implements  接口名表{……}

👀一个类实现一个接口应注意的问题:

  • 如果实现某接口的类不是abstract的抽象类,则在类的定义部分必须实现指定接口的所有抽象方法。
  • 一个类在实现某接口的抽象方法时,必须使用完全相同的方法头。
  • 接口中抽象方法被指定为public,所以类在实现方法时,必须显示地使用public修饰符。
  • 接口可以作为一种引用类型来使用,可以声明接口类型的变量或数组,并用它来访问实现该接口的类的对象。
    (通过接口类型的变量可以访问类所实现的接口的方法)

实战演练

【例】Orange实现Eatable接口。

 public interface Eatable {//抽象方法public abstract String howtoEat();
}
public class Orange @Overridepublic String howtoEat(){returnMake Orange Juice}
}

👅接口的继承

  • 定义一个接口时可通过extends关键字声明该新接口是某个已存在的父接口的派生接口。
  • 与类继承的区别:一个接口可以有一个以上的父接口,它们之间用逗号隔开,形成父接口列表。
  • 新接口将继承所有父接口的常量、抽象方法和默认方法,但不能继承父接口的静态方法(也不能被实现类所继承)。
  • 多重继承:一个子类可以有一个以上的直接父类,该子类可以继承它所有直接父类的成员。
  • Java语言虽不支持多重继承,但可以利用接口间接地解决多继承问题。
  • 一个类只能有一个直接父类,但是它可以同时实现若干个接口(Java中接口的主要作用是可以帮助实现多重继承。)。一个类实现多个接口时,在implements子句中用逗号分隔各个接口名。

实战演练

【例】接口继承多个接口。CC接口继承AA接口和BB接口

public interface AA { int STATUS = 100;public abstract void display();   
} 
public interface BB { public abstract void show();     public default void print(){     System.out.println("这个是接口BB的默认方法");}
}
public interface CC extends AA, BB{ int NUM = 3;    
}
public class DD implements CC {public void display() {System.out.println("接口AA的display方法");}public void show() {System.out.println("接口BB的show方法");}public static void main(String[] args) {DD dd = new DD();System.out.println(DD.STATUS);dd.show();dd.print(); AA aa = new DD();aa.display();}
}

运行结果:
在这里插入图片描述
解释代码:
上述AA、BB、CC接口与DD类之间的关系如图所示;图中虚线表示接口实现。
接口是允许多继承的,而类只能实现单继承。
在这里插入图片描述

实战演练

【例】类实现多个接口。AB类实现AA接口和BB接口

public class AB implements AA, BB{public void display(){System.out.println("接口AA的display方法");}   public  void show(){    System.out.println("接口BB的show方法");}
}

类实现多个接口需实现每个接口中的抽象方法。接口中的常量和默认方法都被继承了,但接口中的静态方不被继承

接口的类型

接口也是一种引用类型,任何实现该接口的实例都可以存储在该接口类型的变量中。

AA aa = new DD();         // 向上自动类型转换
BB bb = new DD();
CC cc = new DD();

当通过接口对象调用某个方法时,Java运行时系统确定该调用哪个类中的方法。

aa.display();   // 调用实现类的方法  
bb.show();    
cc.print();    // 调用继承的默认方法

常量

定义在接口中的任何变量都自动加上public、final、static属性,因此它们都是常量,常量的定义可以省略修饰符,下面三行代码效果相同。

 int STATUS = 100;public int STATUS = 100;public final static int STATUS = 100;

不推荐在接口中定义常量,使用枚举类型描述一组常量集合比接口常量更好。

实战演练

1.设计一个名为Swimmable的接口,其中包含void swim()方法,设计另一个名为Flyable的接口,其中包含void fly()方法。
2.定义一个Duck类实现上述两个接口。

// Swimmable接口  
interface Swimmable {  void swim();  
}  // Flyable接口  
interface Flyable {  void fly();  
}  // Duck类实现Swimmable和Flyable接口  
class Duck implements Swimmable, Flyable {  // 实现Swimmable接口的swim方法  @Override  public void swim() {  System.out.println("The duck is swimming.");  }  // 实现Flyable接口的fly方法  @Override  public void fly() {  System.out.println("The duck is flying.");  }  // 可以在Duck类中添加其他方法和属性  
}  // 测试类  
public class Main {  public static void main(String[] args) {  Duck duck = new Duck();  duck.swim(); // 调用swim方法  duck.fly();  // 调用fly方法  }  
}

在这个例子中,SwimmableFlyable是两个接口,它们分别定义了swimfly方法。Duck类通过implements关键字实现了这两个接口,因此它必须提供这两个方法的具体实现。在main方法中,我们创建了一个Duck对象,并调用了它的swimfly方法,输出了相应的信息。

静态方法

  • 在Java 8中,可以在接口中定义静态方法,定义静态方法使用static关键字,默认的访问修饰符是public。
  • 接口的静态方法不能被子接口继承,也不被实现类继承。
  • 接口中的静态方法不能被子接口和实现类继承,访问形式为:接口名.静态方法名( )。
public interface SS {int STATUS = 100;                    public static void display() {System.out.println(STATUS);}
}

默认方法

  • 接口中的默认方法用default修饰符来定义,默认方法可以被子接口或被实现该接口的类所继承。访问形式为:对象名.默认方法名( )。
  • 子接口中若定义名称相同的默认方法,则父接口中的默认方法被隐藏。
public interface BB { public void show();     public default void print(){     System.out.println("这个是接口BB的默认方法");}
}

解决默认方法冲突

  • 如果子接口中定义了与父接口同名的常量或者相同的方法,则父接口中的常量被隐藏,方法被覆盖。
  • 但在接口的多重继承中可能存在常量名或方法名重复的问题,即名字冲突问题。
  • 对于常量,若名称不冲突,子接口可以继承多个父接口中的常量,如果多个父接口中有同名的常量,则子接口不能继承,但子接口中可以定义一个同名的常量。
  • 对于多个父接口中存在同名的方法时,此时必须通过特殊的方式加以解决。
  • 在多个父接口的实现类中解决同名默认方法的名字冲突问题有两种方法:一种是提供同名方法的一个新实现;另一种是委托一个父接口的默认方法。
  • 如果两个父接口有一个提供的不是默认方法,而是抽象方法,则在实现类中提供同名方法的一个新实现即可。
  • 如果一个类继承了一个父类并实现了一个接口,而从父类和接口中继承了同名的方法,此时采用“类比接口优先”的原则,即只继承父类的方法,而忽略来自接口的默认方法。

实战演练

【例】在两个接口Person和Identified中定义的同名默认方法getID ( ),在实现类中委托其中一个父接口的默认方法

public interface Person { public String getName();public default int getID(){return 0;}
}
public interface Identified {public default int getID(){return Math.abs(hashCode());}
}
public class Employee implements Person, Identified { String name;@Overridepublic String getName(){return this.name;}    public int getID(){ return Identified.super.getID();} // 为getID()方法提供一个新的实现
}

博主用心写,读者点关注,互动传真情,知识不迷路。

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

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

相关文章

构建高并发Web服务:Gunicorn与Flask在Docker中的完美融合

1. 引言 在数字化时代,Web服务的性能和可靠性对于任何在线业务的成功至关重要。随着用户基数的增长和业务需求的扩展,高并发处理能力成为了衡量一个Web服务质量的关键指标。高并发Web服务不仅能够确保用户体验的流畅性,还能在流量激增时保持…

0730作业+梳理

一、作业 代码&#xff1a; #include<myhead.h> int main(int argc, const char *argv[]) { //判断文件个数 if(argc ! 3) { write(2,"input file error\n",sizeof("input file error\n")); return -1; } int …

图片的存储

1.更换头像 //里面内容是调用方法将选择的电脑图片存储进字节数组&#xff0c;在转发给服务端&#xff0c;在服务端中进行保存。 void changeimageButtonOnAction(ActionEvent event)throws IOException, ClassNotFoundException, SQLException {FileChooser fileChooser n…

30岁决心转行,AI太香了

今天是一篇老学员的经历分享&#xff0c;此时的王同学在大洋彼岸即将毕业&#xff0c;手握多家北美大厂offer&#xff0c;一片明媚。谁能想到王同学的转码之路竟始于一场裁员&#xff0c;这场访谈拉开了他的回忆。 最近总刷到一些关于转行的话题&#xff0c;很多刚毕业的同学喜…

【Golang 面试 - 进阶题】每日 3 题(八)

✍个人博客&#xff1a;Pandaconda-CSDN博客 &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/UWz06 &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享 Golang 面试中常见的面试题给大家~ ❤️如果有收获的话&#xff0c;欢迎点赞&#x1f44d;收藏…

物理数据库迁移到云上

物理数据库迁移到云上 物理数据库迁移到云上通常需要以下步骤: 评估和规划 评估物理数据库的需求和约束条件&#xff0c;确定迁移的目标。考虑数据库大小、性能要求、数据复杂性等因素&#xff0c;选择合适的云服务提供商和服务模式。 设置云环境 在云平台上创建适当的虚拟…

Anaconda配置记录-linux环境

Anaconda Distribution 是一个 Python/R 数据科学分发&#xff0c;其中包含&#xff1a; conda - 用于命令行界面的包和环境管理器 Anaconda Navigator - 基于 conda 构建的桌面应用程序&#xff0c;具有从托管环境中启动其他开发应用程序的选项 超过 300 个自动安装的软件包…

嵌入式初学-C语言-八

#接嵌入式初学-C语言-七# 分支结构 分支结构&#xff1a;又被称之为选择结构 选择结构的形式 多分支 语法&#xff1a; if(条件1) { 语句1; } else if(条件2) { 语句2; } ... else { 语句n1; }案例&#xff1a; #include <stdio.h> int main() { // 需求&#xff…

Java中适配Redis单机和集群模式

/** * 根据配置创建Redis连接工厂 * 支持单机和集群模式 * */ application.properties配置文件 Redis配置类&#xff1a; package com.t6bi.carrier.app.config;import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.context.annotat…

鱼眼相机在FOV比较大时, undistortPoint() 和 undistortImage() 结果相差很大

在做鱼眼图像矫正时&#xff0c;碰到一个很有意思的情况&#xff0c;即在鱼眼相机FOV比较大时&#xff0c; undistortPoint() 和 undistortImage()对应点的结果不一致。 两个函数的调用如下&#xff1a; 浅蓝色的点是画在原始图像上的。 浅蓝色的点随着图像undistortImage()矫…

科大讯飞语音转写demo go语言版

上传了一个语音文件&#xff0c;识别效果。 package audioimport ("bytes""crypto/hmac""crypto/md5""crypto/sha1""encoding/base64""encoding/json""fmt""io/ioutil""net/http"…

商用密码测评之对HTTPS(TLS)协议中各个参数解释

1、TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 是一个广泛使用的TLS&#xff08;传输层安全协议&#xff09;加密套件&#xff0c;它结合了多种技术和算法来确保网络通信的安全。下面是对该加密套件中各个参数的详细解释&#xff1a; 1. TLS 定义&#xff1a;TLS&#xff08;传…

Spring源码-加载配置文件spring-${username}.xml变量名的解析

启动类: ApplicationContext ac new ClassPathXmlApplicationContext("spring-${username}.xml");Person bean ac.getBean(Person.class);调用链路如下&#xff1a; parseStringValue:130, PropertyPlaceholderHelper (org.springframework.util) replacePlacehold…

【Linux】make/Makefile的理解

1.make是一个命令&#xff0c;makefile是一个文件, 依赖关系和依赖方法. a.快速使用一下 i.创建一个Makefile文件(首字母也可以小写) b.依赖关系和依赖方法 i.依赖关系: 我为什么要帮你? mybin:mytest.c ii.依赖方法: 怎么帮? gcc -o mybin mytest.c make之前要注意先创建…

Pinely Round 4 (Div. 1 + Div. 2)(A~D)

A. Maximize the Last Element 思路: 签到题,判断每个数前面和后面数的数量能否被2整除,如果都能就可以得到,然后求最大值就行 代码: #include<bits/stdc.h> #include <unordered_map> using namespace std; #define N 200010 typedef long long ll; typedef un…

【源码阅读】Redisson lock源码

Redisson 加锁非常简单&#xff0c;还支持 redis 单实例、redis 哨兵、redis cluster、redis master-slave 等各种部署架构 RLock lock redisson.getLock("cyk-test"); lock.lock(); lock.unlock(); 底层原理 加锁机制 废话不多说&#xff0c;直接看源码&#xf…

从 Pandas 到 Polars 三十九:Polars 和 Matplotlib

Polars 与 matplotlib 配合得很好。 在matplotlib中&#xff0c;你可以直接使用polars的数据进行绘制图形&#xff0c;而无需把polars的dataframe转为pandas的dataframe&#xff1a; import polars as pl import matplotlib.pyplot as plt# 创建一个polars DataFrame df_pl …

店铺销售数据中心大屏,引领智慧决策新风尚

为了精准把握市场动态&#xff0c;高效驱动业务增长&#xff0c;越来越多的商家开始拥抱“智慧零售”的浪潮&#xff0c;山海鲸可视化搭建的店铺销售数据中心大屏&#xff0c;以直观、智能、高效的方式&#xff0c;为商家开启了一扇通往未来商业视界的大门。 想象一下&#xff…

探索目标检测算法:科技核心的力量

1. 引言 - 目标检测算法的重要性 在当今的科技时代&#xff0c;计算机视觉技术已经渗透到我们生活的方方面面。从自动驾驶汽车、无人机监控、智能安防、医疗影像分析到工业自动化&#xff0c;目标检测算法作为计算机视觉领域的核心技术之一&#xff0c;其重要性不言而喻。目标检…

01 - 计算机组成原理与体系结构

文章目录 一&#xff0c;计算机系统硬件基本组成硬件软件 二&#xff0c;CPU的功能与组成功能组成运算器控制器 三&#xff0c;数据表示计算机的基本单位进制转换原码&#xff0c;反码&#xff0c;补码&#xff0c;移码数值表示范围浮点数表示 四&#xff0c;寻址五&#xff0c…