【Java寒假打卡】Java基础-接口

news2024/11/17 3:28:47

【Java寒假打卡】Java基础-接口

    • 接口的介绍
    • 接口的定义和特点
    • 接口中的成员特点
    • JDK8 接口中的成员特点
    • JDK9 接口中的成员特点
    • 类和接口的关系

接口的介绍

 当一个类中的所有方法都是抽象方法的时候,我们就可以将其定义为接口,接口也是一种引用数据类型,他比抽象类还要抽象

 接口存在的两个重要意义

  • 规则的定义
  • 程序的扩展性

接口的定义和特点

  • 接口使用关键字interface来定义 public interface 接口名{}
  • 接口不能实例化
  • 接口和类之间是实现关系,通过implements关键字来表示 public class 类名 implements 接口名{}
  • 接口的子类(实现类) 要么重写接口所有抽象方法 要么是抽象类

接口不允许创建对象,接口和类的实现关系,可以是单实现,也可以是多实现

接口中的成员特点

  • 成员变量
    • 只能是常量 使用final关键字修饰
    • 默认修饰符:public static final
  • 构造方法
    • 接口没有构造方法
  • 成员方法
    • 只能是抽象方法
    • 默认修饰符 public abstract
package com.hfut.test;

public interface Inter {
    // 接口中没有构造方法 实现类的构造方法 访问的是Object
//    public Inter(){
//
//    }

    public static final int NUM = 10;// 默认添加 public static final 静态成员变量
    public abstract void st();// 接口中的抽象方法

    void show();// 默认添加public abstract 两个关键字  也就是接口中的方法只能是抽象方法
}


package com.hfut.test;

public interface InterA {
    public abstract void print1();
    public abstract void print2();
    public abstract void st();


}

package com.hfut.test;

// 可以实现多个接口  但是继承 只可以是单继承
public class InterImpl implements Inter,InterA {

    public InterImpl(){
        super();// super实现的是Object类
    }

    public void methd(){
        System.out.println(NUM);// 只能使用接口中的成员变量  不可以修改
//        NUM = 20;// 不可以修改 因为接口的成员变量使用了final关键字进行修饰  常量不可以进行修改
    }

    // 多个接口都存在该方法  代码不会出现冲突
    @Override
    public void st() {
        System.out.println("实现接口中的方法");
    }

    @Override
    public void show() {

    }

    @Override
    public void print1() {

    }

    @Override
    public void print2() {

    }
}

package com.hfut.test;

public class InterMain {
    public static void main(String[] args) {
        InterImpl i = new InterImpl();
        i.st();

        System.out.println(Inter.NUM);// 接口的成员变量是静态成员变量
    }
}

JDK8 接口中的成员特点

问题:接口升级,添加若干方法,它的实现类就需要重写这些方法

解决思路:允许接口中定义带有方法体的方法 但是需要使用关键字default进行修饰,这些方法就是默认方法,作用:解决接口升级问题

接口中默认方法的定义格式:

  • 格式:public default 返回值类型 方法名(参数列表){}
  • 例子:public default void show(){}

作为实现类,可以直接使用接口中的默认方法

package com.hfut.test1;

public interface Inter {
    public default void showA(){
        System.out.println("接口中自带的方法  实现类不需要重写该方法");
    }
}


package com.hfut.test1;

public class InterImp implements Inter{

    // 实现类重写接口中的自定义方法  不可以添加default关键字  会报错
    @Override
    public void showA() {
        System.out.println("实现类重写的showA方法");
    }
}


package com.hfut.test1;
import com.hfut.test.InterImpl;

public class Main {
    public static void main(String[] args) {
        InterImp i = new InterImp();
        i.showA();// 接口中的默认方法可以直接进行调用
    }
}

接口中默认方法的注意事项:

  • 默认方法不是抽象方法,所以不强制被重写,但是可以被重写,重写的时候去掉default关键字
  • public可以省略,default不能被省略
  • 如果实现多个接口 多个接口中存在相同的方法声明,子类就必须对该方法进行重写

接口中允许定义static静态方法

  • public static 返回值类型 方法名(参数列表){}
  • public static void show(){}
package com.hfut.test1;

public interface Inter {
    public static void showA(){
        System.out.println("接口中自带的方法  实现类不需要重写该方法");
    }
}

package com.hfut.test1;

public class InterImp implements Inter{

}

package com.hfut.test1;

import com.hfut.test.InterImpl;

public class Main {
    public static void main(String[] args) {
        InterImp i = new InterImp();
//        i.showA();// 接口中的静态方法不可以使用 实现类对象进行调用
        Inter.showA();// 接口中的静态方法 只能通过接口类名.方法进行调用
    }
}

接口中静态方法的注意事项

  • 静态方法只能通过接口名进行调用,不能通过实现类名或者对象名进行调用
  • public可以省略,static不能省略

JDK9 接口中的成员特点

允许定义私有方法:

格式1:private 返回值类型 方法名(参数列表){}
范例1:private void show()

格式2:private static 返回值类型 方法名(参数列表){}
范例2:private static void method()

package com.hfut.test2;

public interface Inter {

    // 定义接口中的default方法
    public default void start(){
        System.out.println("start方法执行...");
        log();
    }

    public default void end(){
        System.out.println("end方法执行...");
        log();
    }

    // JDK9之后 接口中允许定义私有方法  只为该接口进行服务
    private void log(){
        System.out.println("日志记录");
    }

    private static void check(){
        System.out.println("静态方法只能调用静态方法");
    }

    public static void open(){
        check();
        System.out.println("open方法执行了");
    }

    public static void close(){
        check();
        System.out.println("check方法执行了");
    }

}


package com.hfut.test2;

import com.hfut.test1.InterImp;

public class TestInter {
    public static void main(String[] args) {

        InterImpl ii = new InterImpl();
        ii.start();
        ii.end();

        // 接口中的静态方法需要通过接口类名直接进行调用
        Inter.open();
        Inter.close();

    }
}

// 接口的实现类
class InterImpl implements Inter{

}

在这里插入图片描述

类和接口的关系

在这里插入图片描述

  • 类和类之间的关系:继承关系 只能是单继承 但是可以多层继承
  • 类和接口的关系:实现关系,可以单实现,也可以是多实现,还可以在继承一个类的同时实现多个接口
  • 接口和接口的关系:继承关系,可以单继承,也可以多继承

问题:一个类实现一个接口,同时继承一个类,接口和父类都有相同的方法,到底调用那个方法

答:调用父类的方法

package com.hfut.test3;

public interface  Inter {
    // 接口中的默认方法
    public default void show(){
        System.out.println("接口中的默认方法");
    }
}

package com.hfut.test3;

public class Fu {
    public void show(){
        System.out.println("父类的show方法");
    }
}


package com.hfut.test3;

import com.hfut.test2.Inter;

public class Main {
    public static void main(String[] args) {
        Inm i = new Inm();
        i.show();// 调用父类的show方法
    }
}

// 继承父类的同时  又实现接口
class Inm  extends Fu implements Inter{

}

接口和接口之间可以进行多继承,但是父接口之间存在相同的方法,这时候就会出现冲突,子接口需要将重名的方法进行重写,实现类需要将以上的所有接口的抽象方法都实现

package com.hfut.test4;

public interface InterA {

    public abstract void m1();// 抽象方法

    public default void show(){
        System.out.println("InterA的实现方法");
    }

}


package com.hfut.test4;

public interface InterB {
    public abstract void m2();// 抽象方法
    public default void show(){
        System.out.println("InterB的实现方法");
    }
}


package com.hfut.test4;

// 接口之间可以多继承
public interface Inter extends InterA,InterB{
    // 父接口中存在多个相同的方法  子接口需要进行重写
    public default void show(){
        System.out.println("重写show方法");
    }
}

package com.hfut.test4;

public class M {
    public static void main(String[] args) {
        Imp i = new Imp();
        i.show();// 调用子接口的show方法  重写之后的方法
    }
}

// 实现子接口 同时需要将所有的父接口中的抽象方法都实现
class Imp implements Inter{

    @Override
    public void m1() {

    }

    @Override
    public void m2() {

    }
}

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

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

相关文章

Redis 缓存数据库

目录Redis 高可用方案高可用概念Redis 高可用的实现方案1、主从模式2、哨兵模式3、集群模式Redis 高可用方案 高可用概念 高可用(High Availability,既HA),指的是通过尽量缩短日常维护操作和减少突发系统奔溃锁导致的停机时间来提…

Vagrant 安装 Centos7

首先准备VirtualBox, 当前实验版本为:7.0.4-154605-Win; 再次下载Vagrant windows版本:当前实验版本:vagrant_2.3.4_windows_i686 如果安装VirtualBox过程中提示缺少:Microsoft Visual C 2019 Redistributable &…

MySQL索引概述

索引的英文名叫 index 在数据库是一种帮助MySQL高效获取数据的数据结构 而且是一种有序的数据结构 在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据, 这样就可以在这些数据结构上实现高级找…

公钥基础设施 时间戳规范测评

声明 本文是学习信息安全技术 公钥基础设施 标准符合性测评. 下载地址而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 公钥基础设施 时间戳规范测评 时间戳的产生和颁发 申请和颁发方式 测评依据见GB/T 20520—2006中6.1的内容。 开发者应提供文档…

2.0、Linux-基础了解

2.0、开机关机和基本目录介绍 开机登录: 开会机会启动许多程序;他们在Windows叫做 "服务" ,在 Linux 中叫做 "守护进程"(daemon); 开机成功后,他会显示一个文本登录…

Tailoring Self-Supervision for Supervised Learning-读后总结

Tailoring Self-Supervision for Supervised Learning摘要文章思路一些值得读的参考文献和技术:值得一读的高引文献可视化技术摘要 近期,在监督学习中部署一个合适的自监督学习来提高监督学习的性能是一个具有前景的方式。然而,因为之前的前…

MP中定义全局常量用于xml的判断,List<String> list = new ArrayList<>(Arrays.asList(“test“));

,1.普通方式 mybatis-plus.configuration.variables.secretFilterSwitch0 yml的方式 mybatis: mapper-locations: classpath:mapper/*.xml type-aliases-package: com.demo configuration: variables: userId: 456132465 userName: 李四 配置完成后在代…

人文社科类文献去哪些数据库检索下载

查找下载人文社科类文献的数据库大盘点: 1、文献党下载器(wxdown.org) 大型文献馆,几乎整合汇集了所有中外文献数据库资源,可附带权限进入文献数据库查找下载文献,覆盖全科包括查找下载人文社科类文献的众…

【C和数据结构-5+1】习题第一天

文章目录一.选择题1.整型在内存中的存储2.大小端字节序3.指针的大小4.形参一级指针或二级指针的区别5.二维数组传参降维成数组指针二.编程题1.自守数2.质数判断一.选择题 1.整型在内存中的存储 猜一猜打印的结果? int main() {char a 101;int sum 200;a 27; sum a;printf…

2023年,无所谓,我会出手整合SSM

目录 一、简介: 二、Maven构建框架: 三、依赖配置 四、web.xml配置文件 五、创建SpringMVC的配置文件 六、Spring.xml配置环境 七、其他配置 八、Mapper.xml配置文件: 九、mybatis-config.xml配置文件: 十、log4j.xml日志…

Dropout详解:Dropout解决过拟合问题

Dropout 是一种能够有效缓解过拟合的正则化技术,被广泛应用于深度神经网络当中。但是被 dropout 所丢掉的位置都有助于缓解过拟合的吗? 中山大学 和 Meta AI 在 NeurIPS 2022 接收的论文在研究了注意力中的 dropout 后发现:不同注意力位置对过…

C++string类介绍

目录 一、介绍 二、string类对象的构造 string类有如下构造方法: 类对象的容量操作 类对象访问及遍历 string对象的修改操作: std::string::insert std::string::erase std::string::c_str std::string::find std::string::substr 一、介绍…

Linux学习笔记 超详细 0基础学习(上)

定义 linux是一个操作系统,与Windows、macos一样,是常见的操作系统之一,一般服务器会部署在Linux操作系统中,稳定应用广泛,Android系统是基于Linux内核的,所以了解Linux相关知识对于程序员来说是很重要的。…

人脸AI识别实战:用AI生成了这些人一生的样貌变化 | 附源码

这是来自斯坦福和华盛顿大学研究员发表的论文,提出了基于GAN的新方法,仅需要一张照片即可生成一个人从小时候到老了的样子。 论文:https://arxiv.org/abs/2003.09764 项目地址: https://github.com/royorel/Lifespan_Age_Trans…

windows上安装并使用exiftool修改图像exif信息

使用exiftool可以对图像的exif信息进行读取、修改、写入等操作。在linux系统上可以直接通过命令行安装,非常方便。但是在windows上,一开始我看了这篇博客,感觉里面写的还挺详细的,就跟着做了一下。里面是说要先安装perl&#xff0…

特斯拉突飞猛进背后带给自己的深思

引言 2013年开始接触汽车行业,那时候所做的事情也是跟着导师去解析整车CAN信号(Message),也是从那时才知道车身现场总线——CAN总线。在那时候汽车给自己的感觉还是整车成本所占比重是机械高,软件比重低的可怜&#x…

【目标检测】语义分割之FCN算法学习

目录:FCN一、CNN与FCN的比较二、FCN上采样理论讲解2.1 双线性插值上采样2.2 反卷积上采样2.3 反池化上采样三、FCN的过程四、跳级结构一、CNN与FCN的比较 CNN:在传统的CNN网络中,在最后的卷积层之后会连接上若干个全连接层,将卷积…

字符串去重整理 哈希映射解题

目录 给你一个字符串数组,删除他们之间相同的元素,(保留一个重复值) 【方法一】使用迭代器进行区间删除 【方法二】原地删除 【方法三】使用计数跳过 1002. 查找共用字符 【解法一】我的第一个理解题意出错的解法 【解法二】初…

稀疏矩阵向量乘法的openmp并行优化

稀疏矩阵向量乘法 添加链接描述本人在这篇博客已经介绍过稀疏矩阵向量乘法以及相关的一些存储方式,这里重点开始介绍openmp的并行优化。 下面这个图片就是采用CSR格式读取稀疏矩阵向量乘法的主体架构,全称为Compressed Sparse Row Matrix压缩稀疏矩阵行格式,该格式对矩阵进…

MyBatis【MyBatis的增删改查操作与单元测试】

MyBatis【MyBatis的增删改查操作与单元测试】🍎一.单元测试🍒1.1 什么是单元测试?🍒1.2 单元测试好处🍒1.3 Spring Boot 框架 单元测试使用🍒1.4 单元测试实现🍒1.5 断言🍎二.MyBati…