Java-10接口与抽象类

news2024/11/24 8:54:10

Java-10接口与抽象类

抽象方法

abstract method机制

这是一个不完整的方法,它只有一个声明,没有方法体

abstract void f();

包含抽象方法的类被称为抽象类:如果一个类包含一个或多个抽象方法,则该类必须被定义为抽象类

public abstract class Basic {
    /**
     * 1、抽象类不能够被实例化
     * 2、包含抽象方法的类称为抽象类
     * 3、如果一个类包含一个或多个抽象方法,则该类必须被定义为抽象类
     */
    abstract void unimplemented();
    abstract void f();
}

抽象类不能够被实例化

public class AbstractTest {
    public static void main(String[] args) {
//        java: org.example.onjava.example10.abstract_class.Basic是抽象的; 无法实例化
//        Basic basic = new Basic();
    }
}

如果一个新类型继承了抽象类,并希望能生成自己的对象,那它必须为基类中的所有抽象方法提供方法定义,也就是说必须重写抽象类中所有抽象方法

public abstract class Basic {
    /**
     * 1、抽象类不能够被实例化
     * 2、包含抽象方法的类称为抽象类
     * 3、如果一个类包含一个或多个抽象方法,则该类必须被定义为抽象类
     */
    public abstract void unimplemented();
    public abstract void f();
}
public class Basic2 extends Basic {
  	// 【注意】继承抽象类后,需要为所有的抽象方法提供定义

    @Override
    public void unimplemented() {
        System.out.println("Basic2.unimplemented");
    }
    @Override
    public void f() {
        System.out.println("Basic2.f");
    }
}

一个抽象类可以不包含任何抽象方法。

如果一个类并不需要包含抽象方法,但同时还想阻止对它任何实例化,这时将其定义为抽象类就好了

public abstract class Basic3 {
    int f(){
        return 666;
    }
    // 没有抽象方法......

    public static void main(String[] args) {
        Basic3 basic3 = new Basic3();
        //Basic3是抽象的; 无法实例化
    }
}

接口

⚠️接口中只允许有public 方法,默认的访问权限修饰符就是public

我们使用关键字interface来定义接口

接口如果不加上public关键字,将获得包访问权限,这样的话该接口就只能在同一个包内使用

public interface AnInterface {
    /**
     * "所有实现了这个特定接口的类看起来都像这样" -> 任何使用了特定接口的代码都知道可以为该接口调用哪些方法
     * 接口是用来在类之间建立"协议"
     * 接口通常暗示 "类的类型"
     * 1、interface关键字创建了一个完全抽象的类,它不代表任何实现
     * 2、接口描述了一个类应该是什么样子的和做什么的,而不是应该怎么做
     * 3、它确定了方法名、参数列表和返回类型,但不提供方法主体
     * 4、接口只提供一种形式,并且除了某些受限制的情况外,它通常不提供实现
     *
     */
    int method01();
    void method02();
    double method03();
    boolean method04(int a, int b);

}

接口也可以包含字段,但这些字段是隐式的static和final

要创建一个符合特定接口的类,使用implements【支持多实现】

/**
 * @Author Coder_Pans
 * @Date 2022/11/16 10:05
 * @PackageName:org.example.onjava.example10.interface_demo.impl
 * @ClassName: Implementation
 * @Description: TODO Concept接口的实现类
 * @Version 1.0
 */
public class Implementation implements Concept, AnInterface {// 实现多个接口用逗号隔开
    @Override
    public int method01() {
        return Concept.i;// 接口中的字段:默认是static和final的
    }

    @Override
    public void method02() {
        System.out.println("我实现了Concept接口......");
    }

    @Override
    public double method03() {
        return 0;
    }
    @Override
    public boolean method04(int a, int b) {
        return a > b;
    }
}

默认方法

当在接口中使用default时,default会允许方法创建一个方法体,实现了该接口的类可以在不定义方法[不实现该方法]的情况下直接替换方法体

/**
*
* 带有默认方法的接口
*/
public interface InterfaceWithDefault {
    void firstMethod();
    void secondMethod();
    // 默认方法
    default void newMethod(){
        System.out.println("default会允许接口中的方法创建一个方法体," +
                "实现了该接口的类可以在不定义方法的情况下直接替换方法体.!>?" +
                "Java8之前不可以default" +
                "实现类可以不实现default方法,但也可以直接调用");
    }
}
/**
 * @Author Coder_Pans
 * @Date 2022/11/16 10:14
 * @PackageName:org.example.onjava.example10.interface_demo.impl
 * @ClassName: DefaultMethodImpl
 * @Description: TODO 实现带有默认方法的接口
 * @Version 1.0
 */
public class DefaultMethodImpl implements InterfaceWithDefault {
    @Override
    public void firstMethod() {
        System.out.println("DefaultMethodImpl.firstMethod()");
    }

    @Override
    public void secondMethod() {
        System.out.println("DefaultMethodImpl.secondMethod()");
    }
    // 该实现类没有实现InterfaceWithDefault中的default方法

    public static void main(String[] args) {
        DefaultMethodImpl defaultMethod = new DefaultMethodImpl();
        defaultMethod.firstMethod();
        defaultMethod.secondMethod();
        defaultMethod.newMethod();// 没有实现也可以直接调用
    }
}

⚠️返回值类型不是方法签名的一部分,不能够用来区分两个方法

接口中的静态方法

定义模版方法(Template Method)

/**
 * @Author Coder_Pans
 * @Date 2022/11/16 10:22
 * @PackageName:org.example.onjava.example10.interface_demo.interfaces
 * @ClassName: Operation
 * @Description: TODO 接口中 的 静态方法
 * @Version 1.0
 */
public interface Operation {
    void execute();

    // 设计模式 -> 模版方法(Template Method)
    // 根据需要传递任意数量的Operation参数,按顺序运行
    static void runOps(Operation... ops){
        for (Operation op : ops){
            op.execute();
        }
    }
    // 接口中 的 静态方法
    static void show(String msg){
        System.out.println(msg);
    }
}

runOps()使用可变参数列表,可以根据需要传递任意数量的参数,并且顺序运行…

/**
 * @Author Coder_Pans
 * @Date 2022/11/16 10:27
 * @PackageName:org.example.onjava.example10.interface_demo.impl
 * @ClassName: MetalWork
 * @Description: TODO
 * @Version 1.0
 */
class Heat implements Operation {
    @Override
    public void execute() {
        Operation.show("Heat......");
    }
}
public class MetalWork {
    public static void main(String[] args) {
        Operation twist = new Operation() {
            @Override
            public void execute() {
                Operation.show("Twist......");
            }
        };
        Operation.runOps(
                new Heat(), // 常规类
                new Operation() {// 匿名类
                    @Override
                    public void execute() {
                        Operation.show("Hammer......");
                    }
                },
                twist :: execute,// 方法引用
                () -> Operation.show("Lambda......")// lambda表达式

        );
    }
}

抽象类和接口

二者之间的区别

抽象类仍然是一个类,在创建新类时只能继承它一个。而创建类的过程中可以实现 多个接口。【爱是抽象且唯一的!

组合多个接口

需要将所 有的接口名称置于 implements 关键字之后且用逗号分隔。可以有任意多个接口,并可以向上转型为每个接口,因为每个接口都是独立的类型。

/**
 * @Author Coder_Pans
 * @Date 2022/11/16 10:44
 * @PackageName:org.example.onjava.example10.interface_demo.impl
 * @ClassName: Adventure
 * @Description: TODO 组合多个接口,接口的多继承
 * @Version 1.0
 */

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

    }
}

/**
 * 需要将所 有的接口名称置于 implements 关键字之后且用逗号分隔。
 * 可以有任意多个接口,并可以向上转型为每个接口,因为每个接口都是独立的类型。
 */
class Hero extends D
        implements A, B, C{

    @Override
    public void aMethod() {

    }

    @Override
    public void bMethod() {

    }

    @Override
    public void cMethod() {

    }
}
interface A{
    void aMethod();
}
interface B{
    void bMethod();
}
interface C{
    void cMethod();
}
class D{
    public void dMethod(){
        System.out.println("dMethod......");
    }
}

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

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

相关文章

CEAC 之《企业信息化管理》3

👨‍💻个人主页:微微的猪食小窝 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 本文由 微微的猪食小窝 原创 收录于专栏 【CEAC证书】 1综合布线属于系统集成的____________。 A、网络应用系统 B、应用基础平台 C、网络平台 D、…

JavaEE 几种spring注解

使用注解可以更简单的存储Bean对象和读取Bean对象。 存储Bean对象 在使用注解之前&#xff0c;需要做一些前置工作&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.springframework.org/schema/beans"…

01- mysql基础

MySQL基础 今日目标&#xff1a; 完成MySQL的安装及登陆基本操作能通过SQL对数据库进行CRUD能通过SQL对表进行CRUD能通过SQL对数据进行CRUD 1&#xff0c;数据库相关概念 以前我们做系统&#xff0c;数据持久化的存储采用的是文件存储。存储到文件中可以达到系统关闭数据不会…

Dendro Azide-PEG-Dendro Azide,Dendro N3-PEG-Dendro N3,PEG超支化树状叠氮

1、名称 英文&#xff1a;Dendro Azide-PEG-Dendro Azide&#xff0c;Dendro N3-PEG-Dendro N3 中文&#xff1a;聚乙二醇-超支化树状叠氮 2、CAS编号&#xff1a;N/A 3、所属分类&#xff1a;Azide PEG 4、分子量&#xff1a;可定制&#xff0c;Dendro Azide-PEG 20K-Den…

【暴力更换OPPO启动器为其它三方(Nova Launcher in my Case Scenario)】

狠搞更换OPPO启动器为三方&#xff08;Nova&#xff09; 我咋就不知道狮子座也有这么强烈的强迫症呢&#xff1f;&#xff01; 我每次玩儿新手机必须得搞搞应用图标呀壁纸呀啥的&#xff0c;必须得打上你“磊哥”的风格烙印。但是国内的启动器的通病就是用不了三方的app图标包…

针对小程序的漏洞挖掘

0x00 前言 我们对小程序的漏洞挖掘&#xff0c;关注点还是在逻辑漏洞上面&#xff0c;下面将从环境搭建到实例一步步讲解。&#xff08;此篇文章更适合做安服的老哥们看&#xff09; 0x01 环境配置 工具&#xff1a;BurpFiddlerwindows版本微信 注: 你也可以直接用burpwindo…

面试笔试题之Linux部分58题(第一部分)

1、Linux常用的发行版 debian、Fedora、Ubuntu、redhat、centOS 等补充&#xff1a; Fedora&#xff1a;软件新&#xff0c;不稳定 redhat&#xff1a;稳定、收费 centOS&#xff1a;稳定、免费 2、在Linux里面查看指定时间段的日志文件 sed -n‘/起始时间/,/结束时间/p’ 日…

一篇文章入门知识图谱

文章目录知识图谱一、为什么需要知识图谱&#xff1f;什么是知识图谱&#xff1f;——KG的前世今生1、看到的不仅仅是字符串2、知识图谱的前世今生二、语义网络&#xff0c;语义网&#xff0c;链接数据和知识图谱1、语义网络&#xff08;Semantic Network&#xff09;2、语义网…

Python编程 元组中不允许的操作

作者简介&#xff1a;一名在校计算机学生、每天分享Python的学习经验、和学习笔记。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​​ 目录 前言 一.元组知识点 1.元组中不允许的操作(熟悉) 2.元组与列表之间的转换(掌握…

echarts5.0引入地图,背景渐变色,航线图,地图阴影

效果图如下&#xff0c;文章末尾附全部代码&#xff1a; 参考&#xff1a; 1、航线图 Vue Echarts飞机航线图_Kinghiee的博客-CSDN博客 2、地图阴影 echarts中国地图实现阴影效果&自定义设置_K.P的博客-CSDN博客 版本&#xff1a; "echarts": "^5.1.2&q…

面向OLAP的列式存储DBMS-9-[ClickHouse]的常用日期时间操作

ClickHouse 日期时间的相关操作函数 1 日期时间操作函数 1.1 toDate和toDateTime toDate、toDateTime&#xff1a;将字符串转成 Date、DateTime 一、传入字符串 SELECT toDate(2020-11-11 12:12:12) v1, toDateTime(2020-11-11 12:12:12) v2; /* ┌─────────v1─…

内聚力模型

背景介绍 材料中不可避免的具有各种缺陷&#xff0c;引起工程中结构断裂的发生。针对裂纹扩展相关问题&#xff0c;研究学者基于线弹性断裂力学&#xff0c;通过理论或数值手段得到裂纹尖端的应力强度因子KI、KII 和 KIII 以及应变能释放率GI、GII 和 GIII&#xff0c;对裂纹的…

C++入门(1)

一、关键字 C语言中只有32个关键字&#xff0c;C有63个关键字&#xff0c;将近翻了一倍。 二、命名空间 在编写代码的时候&#xff0c;会遇到定义的变量名和库中的函数名重复&#xff0c;出现命名冲突的情况。在C中有变量名、函数名还有类名&#xff0c;这些都会存在全局域…

两种方式实现websocket获取数据库查询进度

两种方式实现websocket获取数据库查询进度 本文实现了两种方式用websocket连接实现前端通过API获取数据库查询进度&#xff0c;作为websocket初步学习的参考 内容目录概要&#xff1a; 使用额外接口获取指定数据库查询进度&#xff0c;查询进度的接口与获取数据的接口分开实…

SAP S4 FI后台详细配置教程- PART3 (财务凭证相关配置篇)

本篇主要介绍凭证相关的配置&#xff0c;希望对学习SAP财务的同学有帮助。 1、定义凭证类型 概念功能说明&#xff1a; • 凭证类型是区分不同交易类型的方法并决定能够被过帐的会计形式。 例如&#xff0c; 可将所有的会计凭证按业务类分成&#xff1a; 总帐凭证、收款…

基础选择器

一、任务目标 掌握基础选择器的应用 二、任务背景 CSS&#xff08;层叠样式表&#xff09;选择器是CSS规则的一部分&#xff0c;用来指定需要设置样式的HTML元素。通过选择器可以实现CSS对HTML元素的一对一、一对多、多对一的控制。 三、任务内容 选择器类型 描述 示例 通配选…

概率论基础

一、条件概率的三大公式 条件概率中的条件就代表观测变量&#xff0c;观测变量意思就是这个变量的取值是否已经定下来了 1.乘法公式 2.全概率公式 随机现象&#xff1a;在一定的条件下&#xff0c;并不总出现相同结果的现象称为随机现象。随机现象的各种结果会表现出一定的…

分类效果评价(机器学习)

目录 准确率 精确率(precision) 召回率(recall&#xff0c;也称为查全率) 调回平均 对于一般分类问题&#xff0c;有训练误差、泛化误差、准确率、错误率等指标 对于常见的二分类问题&#xff0c;样本只有两种分类结果&#xff0c;将其定义为正例与反例。 那么在进行分类…

基于java大学生就业信息管理系统

随着高校教育体制的改革大学生人数的不断增加&#xff0c;毕业生就业制度发生了根本的变化。单位和学生走向人才市场&#xff0c;双向选择&#xff0c;择优录用。因此在这样的情况下&#xff0c;在INTERNET上开发并运行信息管理系统就能够极大地提高工作效率&#xff0c;弥补了…

VMware 网络模式

VMware提供了三种网络工作模式&#xff0c;它们分别是&#xff1a; Bridged&#xff08;桥接模式&#xff09; NAT&#xff08;网络地址转换模式&#xff09; Host-Only&#xff08;仅主机模式&#xff09; 1、桥连接模式 【NAT 设置】【DHCP 设置】不可编辑 2、仅主机模式 【自…