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

news2025/1/10 1:31:20

在这里插入图片描述

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

接口介绍

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

接口

概述

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 
  @Override
  public 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;
    @Override
    public String getName(){
      return this.name;
    }    
    public int getID(){ 
      return Identified.super.getID();
    } // 为getID()方法提供一个新的实现
}

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

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

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

相关文章

一投就中不是梦,录取率>80%,最快1个月就见刊,计算机沾边就收,认可度还不低

本次模术狮精心整理5本期刊,最快1个月就见刊,计算机沾边就收,认可度还不低! 1 Knowledge-Based Systems ▲ 图片来源:Knowledge-Based Systems官网 期刊简介:《Knowledge-Based Systems》是人工智能领域的…

(2024,缩放定律,信息论,模型大小与数据的线性关系)神经缩放定律的信息论基础

Information-Theoretic Foundations for Neural Scaling Laws 公和众与号:EDPJ(进 Q 交流群:922230617 或加 VX:CV_EDPJ 进 V 交流群) 目录 0. 摘要 1. 简介 3. 缩放定律 4. 一个例子 5. 结论 0. 摘要 神经网络…

EasyExcel - table写入复杂表头及内容

需求:在一个工作簿中,需要填充固定字段信息,并写入多个不同的标题列的表格及内容。 常规Excel写入一般是一个工作簿一个表头。 目录 一、复杂表单分析1.表单示例2.复杂表单拆解3.准备模板 二、EasyExcel文档1.最简单的填充Excel2.使用table去…

[Linux安全运维] Nginx安装部署以及LNMP框架搭建保姆级教程

前言 LNMP:Linux 系统下 NginxMySQLPHP 网站服务器架构。因为四种软件均是免费开源网站,所有这是一个免费、高效的网站服务系统。 本章主要介绍的是Nginx相关的环境部署,以及LNMP框架的搭建,Nginx知识点介绍在文章:[…

昇思25天学习打卡营第23天|基于MindSpore的红酒分类实验案例:从数据准备到模型预测

目录 MindSpore 版本配置与红酒数据集下载 葡萄酒数据读取、处理与可视化分析 基于 KNN 算法的样本分类模型构建与预测函数定义 基于 KNN 模型的测试集预测与准确率计算 MindSpore 版本配置与红酒数据集下载 首先使用 %%capture captured_output 捕获后续代码的输出。然后&a…

【Django5】内置Admin系统

系列文章目录 第一章 Django使用的基础知识 第二章 setting.py文件的配置 第三章 路由的定义与使用 第四章 视图的定义与使用 第五章 二进制文件下载响应 第六章 Http请求&HttpRequest请求类 第七章 会话管理(Cookies&Session) 第八章 文件上传…

python中,jsonpath提取数据的时候出现TypeError: ‘bool‘ object is not subscriptable怎么解决

json格式如下: { success: True, result: { codeInfo: { code: 0, msg: 成功 }, uploadToken: { resId: rzJRpo, endpoint: https://sit-api-ypsx-resource.ypsx-internal.com/r…

知识分享|temu跨境选品师盈利一般要多久?

在成为一名跨境选品师,特别是在TEMU(The Easy Market University)平台上,盈利的速度取决于多种因素,包括个人技能、市场选择、产品定位和运营策略等。这些因素共同决定了一个选品师从初始阶段到稳定盈利的时间轨迹。 首先,对于新手…

vue3组件通信(一)

组件通信 一.props(父<>子)二.自定义事件&#xff08;子>父&#xff09;三.mitt(实现任意组件通信)四.v-model(父<>子)(1).v-model的本质(2).组件标签中v-model的本质(3).$event到底是什么 概况 一.props(父<>子) 使用频率最高 若 父传子&#xff1a;属性…

Redis结合Lua脚本的简单使用

我们就拿购物车举例子 现在有5个东西免费送&#xff0c;我们只能选择1个 例如 可乐 美年达 香蕉 苹果 薯片 我们选择后就放进redis里面 然后我们不能选重复&#xff0c;只能选不同 Lua脚本 我们redis使用lua脚本的时候&#xff0c;会传两个参数进去 一个是List<Strin…

(新)VMware虚拟机安装Linux教程(超详细)

创作不易&#xff0c;禁止转载抄袭&#xff01;&#xff01;&#xff01;违者必究&#xff01;&#xff01;&#xff01; 创作不易&#xff0c;禁止转载抄袭&#xff01;&#xff01;&#xff01;违者必究&#xff01;&#xff01;&#xff01; 创作不易&#xff0c;禁止转载抄…

PMP相关考点整理

PMP知识点整理 一、预测型4. 项目整合管理启动:4.1 制定项目章程规划:4.2 制定项目管理计划执行:4.3 指导与管理项目工作4.4 管理项目知识监控4.5监控项目工作4.6 实施整体变更控制【都是重点】收尾4.7 结束项目或阶段5. 项目范围管理启动:/规划:/5.1 规划范围管理5.2 收集…

36.【C语言】函数栈帧的创建和销毁

本文将解决以下问题 局部变量是怎么创建的&#xff1f; 为什么局部变量的值是随机值&#xff1f; 函数是怎么传参的&#xff1f;传参的顺序是怎样的&#xff1f; 形参和实参是什么关系&#xff1f; 函数调用是怎么做的&#xff1f; 函数调用是结束后怎么返回的&#xff1f; 本文…

电脑部分数据丢失?别担心,这里有恢复指南!

在数字化时代&#xff0c;电脑已成为我们日常生活中不可或缺的设备&#xff0c;存储着大量重要的工作文档、个人照片、视频回忆以及各类学习资料。然而&#xff0c;无论是由于误操作、系统故障、病毒攻击还是硬件损坏&#xff0c;电脑数据丢失的情况时有发生&#xff0c;令人焦…

JAVA(IO流-字节流)day 7.29

ok家人们今天继续学习IO流&#xff0c; 一.字节流 存储时&#xff0c;都是使用二进制来保存。 2.1 字节输出流OutputStream OutputStream是字节输出流的超类&#xff08;父类&#xff09;, 方法 public abstract void write(int b)&#xff1a; 一次写一个字节数据。pub…

如何实现无公网IP远程访问本地内网部署的Proxmox VE虚拟机平台

文章目录 1. 局域网访问PVE2. 安装Cpolar 工具3. 创建PVE公网地址4. 远程访问PVE5. 设置固定域名6. 固定地址访问 Proxmox VE是一个完全开源的平台&#xff0c;基于Debian Linux&#xff0c;用于运行虚拟机和容器。为了提供最大的灵活性&#xff0c;它支持两种虚拟化技术&#…

超简单!证件照换底色一分钟速成技巧

证件照的底色一般情况下分为&#xff1a;蓝色、红色、白色 证件照的尺寸也分为&#xff1a;一寸、两寸、大一寸、小二寸等 不同的文件或需求场景下对于证件照的底色和尺寸都有不同的要求&#xff0c;想要更方便的变更证件照可以先保存一版电子版&#xff0c;然后每次在初始版…

C++使用Boost库对时间的操作

0x00、获取当前时间&#xff0c;时间格式为yyyy-MM-dd hh:mm:ss.zzz std::string GetCurrentTime() {// 使用本地时间boost::posix_time::ptime now boost::posix_time::microsec_clock::local_time();// 获取毫秒部分boost::posix_time::time_duration td now.time_of_day(…

【数据结构】——双链表的实现(赋源码)

双链表的概念和结构 双链表的全称叫做&#xff1a;带头双向循环链表 它的结构示意图如下 注意&#xff1a;这⾥的“带头”跟前⾯我们说的单链表的“头结点”是两个概念&#xff0c;实际前⾯的在单链表阶段称呼不严谨&#xff0c;但是为了读者们更好的理解就直接称为单链表的头…

学习008-02-04-09 Assign a Standard Image(分配标准图像)

Assign a Standard Image&#xff08;分配标准图像&#xff09; This lesson explains how to associate an entity class with a standard image from the DevExpress.Images assembly. This image illustrates the entity class in the following sections of the UI: 本课介…