【JavaSE】抽象类和接口

目录

前言

1. 抽象类

1.1 认识抽象类

1.2 抽象类的特征

1.3 抽象类的作用

2. 接口

2.1 接口的概念

2.2 接口的语法

2.3 接口的使用

2.4 接口的特性

2.5 接口的好处

2.6 接口之间的继承

结语


前言

今天我们来讲Java中的抽象类和接口,它们在面向对象中发挥着重要的作用,解决了我们前面学习的继承的一个痛点,具体是什么呢?在这里我先买一个关子

1. 抽象类

1.1 认识抽象类

在面向对象中,所有的对象都是通过类来描述的,但是有些类却因包含的信息不足以描述出一个完整的对象,这些类我们就把它们叫做抽象类

在Java中有一个关键字叫:abstract,它的意思就是抽象。abstract修饰类,这个类就是抽象类;abstract修饰方法,这个方法就是抽象方法。要注意:抽象方法只能有方法签名,一定不能有方法体

//抽象类
public abstract class Test{
    //抽象方法
    public abstract void func( );
}

1.2 抽象类的特征

  • 抽象类也是类,它的内部可以包含普通成员方法和成员变量,也可以有构造器
  • 抽象类中不一定有抽象方法,但是有抽象方法的类一定是抽象类
  • 抽象类不能够创建对象(就算抽象类中没有抽象方法,也不能被实例化)
  • 抽象类仅作为一种特殊的父类,让子类继承并实现(因为抽象方法要被重写,所以抽象方法不能用private、final、static修饰)
  • 一个类继承抽象类,就必须重写抽象类中所有抽象方法,否则这个类也必须定义成抽象类

因为Animal类无法准确描绘出一个对象,所以我们把它设置为抽象类,然后再创建一个Dog类来继承Animal,并重写Animal中的抽象方法,最后使用父类类型引用子类对象,再调用重写方法,实现多态 

1.3 抽象类的作用

抽象类本身不能被实例化,只能创建一个新的类来继承抽象类,让子类重写抽象类中的抽象方法

实际上抽象类在开发中并不是必备的,但是使用抽象类就相当于多了一层校验,它可以帮我们检测是否误用为被重写的方法,支持我们更好地使用多态

2. 接口

2.1 接口的概念

接口类似我们上面讲到的抽象类,它是用于描述类有什么功能,但又不给出具体的实现。在Java中,接口可以看成是:多个类的公共规范,它对外提供一组规则,标准

2.2 接口的语法

Java提供了interface关键字,用来声明一个接口,接口的访问权限符只能是public或者默认

public interface 接口名{
    //成员变量(常量)
    //成员方法(抽象方法)
}

我们定义成员变量和成员方法时不需要在前面添加任何修饰符号。因为:

  • 接口当中的成员变量,默认被public static final修饰,此时的成员变量也叫做常量,定义好后一定要记得初始化
  • 接口当中的成员方法,默认被 public abstract修饰,此时的成员方法也就是抽象方法,不能有方法体

接口的定义格式和定义类的格式基本一样,把class关键字换成interface关键字,就定义好一个接口。我们可以让编译器帮我们创建接口,接口名要采用大驼峰的形式命名


2.3 接口的使用

接口不能直接使用,必须得有一个类来实现该接口,并且要实现接口中的所有抽象方法,此时这个类也就做:实现类

public class 类名 implements 接口名{
    //……
}

要注意的是:在继承中,子类和父类之间是用extends来继承的;而类实现接口用的是implements实现的

2.4 接口的特性

  1. 接口类型是一种引用类型,但是我们不能直接new一个接口对象


     
  2. 接口中的方法都会被隐式指定为public abstract,接口中的变量都会被隐式指定为public static final
     
  3. 接口中不能有有静态代码块和构造器


     
  4. 重写接口中的方法时,要使用public修饰
  5. 如果类没有是实现接口中的所有抽象方法,那么该类必须设置为抽象类
  6. 在JDK8之后,接口中可以使用static和default修饰方法

2.5 接口的好处

在前面的学习中我们得知,类和类之间是单继承的,一个类只能有一个父类,不能支持多继承。但是一个类却可以是实现多个接口的(理论上是无数个)

一个类在实现多个接口时,每个接口中的抽象方法都要实现。否则该类必须设置为抽象类


既然如此,我们可以使用继承和接口,来让一个类的功能变得更加强大,更加全面

场景:要求设计一个People类里面包含人的一些基础信息(姓名、年龄、性别),还有一个Student类继承People类,再设计两个接口,功能包含跑步、唱歌等


People类: 

public class People {
    private String name;
    private int age ;
    private String gender;

    public People(String name, int age, String gender) {
        this.name = name;
        this.age = age;
        this.gender = gender;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }
}

两个接口Running、Singing:

public interface Running {
    void run();
}

public interface Singing {
    void sing();
}

 Student类:

public class Student extends People implements Running,Singing{

    public Student(String name, int age, String gender) {
        super(name, age, gender);
    }

    @Override
    public void run() {
        System.out.println(this.getName() + "在跑步~~~");
    }

    @Override
    public void sing() {
        System.out.println(this.getName() + "在唱歌~~~");
    }
}

测试类Test:

public class Test {
    public static void main(String[] args) {
        Student student = new Student("张三",19,"男");
        student.run();
        student.sing();
    }
}

运行结果如下:

从上面的例子我们可以看出,我们可以让一个类继承一个父类,代表它的是属于什么类型,接口则可以表示为该类具有什么功能,能做什么特有的事情,如果我们把功能全写进父类里,则不符合我们的常规逻辑:是人就一定会跑步吗、一定会唱歌吗。有了接口后,类的使用者就不用关心具体类型,只需要关注某个类是否具备某种能力就行

例子:我们实现一个“散步”方法

2.6 接口之间的继承

接口之间也能多继承,一个接口可以同时继承多个接口,相当于扩展了接口的能力,把多个接口合并到了一起

结语

关于抽象类和接口部分的知识就介绍到这里。在本篇博客中,咱介绍了抽象类和接口,以及它们的使用和特征。接口解决了类无法多继承的缺陷,同时接口之间也可以多继承,这一点十分的重要,接口的出现让面向对象的思想变得更加灵活开放,在下篇博客中我们会介绍接口的几个实际案例,带大家真正认识接口带给我们的好处。

希望大家能喜欢这篇文章,有总结不到位的地方还请多多谅解,若有出现纰漏,希望大佬们看到错误之后能够在私信或评论区指正,博主会及时改正,共同进步!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

前端应用开发实验:条件渲染和循环渲染

目录 实验目的相关知识点实验内容图片的隐藏和显示代码实现效果 电影票房排序代码实现效果 代办事项记录代码实现效果 实验目的 (1)熟练掌握v-on 指令的用法,学会使用v-on 指令监听DOM元素的事件,并通过该事件触发调用事件处理程序。 (2)掌握v-on指令修…

大学理科用什么软件搜题?推荐5个搜题软件和学习工具 #其他#知识分享#经验分享

大学生的学习生活离不开一些实用的工具,它们能够帮助我们更高效地学习和管理时间。 1.千鸟搜题 这是一个公众号 这是一个老公众号了,我身边的很多朋友都在用,支持超新星、学习强国、知到、智慧树和各类专业网课题目。 下方附上一些测试的试…

Axure案例分享—折叠面板(附下载地址)

今天和大家分享的Axure案例是折叠面板 折叠面板是移动端APP中常见的组件之一,有时候也称之为手风琴。咱们先看下Axure画出的折叠面板原型效果,然后再对该组件进行详细讲解。 一、功能介绍 折叠或展开多个面板内容,默认为展开一项内容&…

【JS】闭包的漏洞

下面这段代码可以实现:通过立即执行函数o返回对象中的get方法,通过参数key得到fn函数内部对象obj中的值。 var fn function () {var obj {a: 1,b: 2}return {get: function (key) {return obj[key]}} }() console.log(fn.get(b)); // 2这是一个典型的…

小红书扫码登录分析与python实现

文章目录 1. 写在前面2. 接口分析3. 代码实现 【🏠作者主页】:吴秋霖 【💼作者介绍】:擅长爬虫与JS加密逆向分析!Python领域优质创作者、CSDN博客专家、阿里云博客专家、华为云享专家。一路走来长期坚守并致力于Python…

基于ssm电子竞技管理平台的设计与实现论文

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本电子竞技管理平台就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数据信息…

MySQL、Oracle的时间类型字段自动更新:insert插入、update更新时,自动更新时间戳。设置自增主键id,oracle创建自增id序列和触发器

1. MySQL 支持设置自增id的字段类型:int、bigint、double等数值类型,一般用int、bigint支持设置自动更新时间的字段类型:datetime、timestamp下面sql中的now()函数可以用current_timestamp()替代 1.1. 不指定秒精度 drop table if exists …

135. 分发糖果(力扣LeetCode)

文章目录 135. 分发糖果题目描述贪心算法代码如下 总结 135. 分发糖果 题目描述 n 个孩子站成一排。给你一个整数数组 ratings 表示每个孩子的评分。 你需要按照以下要求,给这些孩子分发糖果: 每个孩子至少分配到 1 个糖果。相邻两个孩子评分更高的孩…

Leetcode - 周赛389

目录 一,3083. 字符串及其反转中是否存在同一子字符串 二,3084. 统计以给定字符开头和结尾的子字符串总数 三,3085. 成为 K 特殊字符串需要删除的最少字符数 四,3086. 拾起 K 个 1 需要的最少行动次数 一,3083. 字符…

Java的三大特性之一——继承

前言 http://t.csdnimg.cn/uibg3 在上一篇中我们已经讲解过封装,这里就主要讲解继承与多态 继承 1.为什么需要继承 Java中使用类对现实世界中实体来进行描述,类经过实例化之后的产物对象,则可以用来表示现实中的实体,但是现实…

centos7安装jdk详细步骤(yum安装与手动安装)

centos7安装jdk详细步骤(yum安装与手动安装) 一、使用yum安装1. 准备工作2. 检查系统是否自带jdk3. 安装jdk 二、手动安装jdk1. 下载上传jdk2. 安装jdk3. 配置环境变量 一、使用yum安装 1. 准备工作 如果你的机器可以联网可以使用此方法 ping www.baidu…

2、Java虚拟机之类的生命周期-连接(验证、准备、解析)

一、类的生命周期 连接阶段之验证 连接阶段的第一个环节是验证&#xff0c;验证的主要目的是检测Java字节码文件是否遵守了<Java虚拟机规范>中的约束。这个阶段一般是不需要程序员进行处理。 主要包含如下四个部分,具体详见<<Java虚拟机规范>>: 1、文件格…

mysql+keepalived实现对mysql的高可用

mysql数据库出现问题 133 解决方案: 在133mysql终端 实行如下命令 mysqlkeepalived实现对mysql的高可用 132 keepalived配置如下 133 keepalived配置如下 132重启keepalived服务 132关闭mysqld服务&#xff0c;vip不见了 133收到vip 132重启mysqld服务和keepalived服务,vip…

C语言——程序拷贝文件

问题如下&#xff1a; 写一个程序拷贝文件&#xff1a; 使用所学文件操作&#xff0c;在当前目录下放一个文件data.txt&#xff0c;写一个程序&#xff0c;将data.txt文件拷贝一份&#xff0c;生成data_copy.txt文件。 基本思路&#xff1a; 打开文件data.txt&#xff0c;读…

PTA题解 --- 剪切粘贴(C语言)

今天是PTA题库解法讲解的第五天&#xff0c;今天我们要讲解剪切粘贴&#xff0c;题目如下&#xff1a; 解题思路&#xff1a; 为了解决这个问题&#xff0c;你可以按照以下步骤进行&#xff1a; 读取输入字符串&#xff1a;首先读取原始字符串。 进行操作&#xff1a;根据输入…

【网络】数据中心网络技术概览

数据中心网络技术概览 一、数据中心网络架构 Crossbar架构&#xff1a;源自早期电话交换网络&#xff0c;由多个输入/输出端口和开关矩阵组成&#xff0c;实现设备间的任意连接&#xff0c;灵活且高效。 **Crossbar架构&#xff08;Crossbar Architecture&#xff09;是一种计…

springboot+vue考试管理系统

基于springboot和vue的考试管理系统 001 springboot vue前后端分离项目 本文设计了一个基于Springbootvue的前后端分离的在线考试管理系统&#xff0c;采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&…

000_coolprop_in_matlab在Matlab中使用CoolProp

在Matlab中使用CoolProp 简介 CoolProp是一个开源的热力学性质库&#xff0c;可以计算多种流体的热力学性质。CoolProp支持多种编程语言&#xff0c;包括Python、C、Matlab等。本文将介绍如何在Matlab中使用CoolProp。 CoolProp官网 本文所使用的Matlab版本为R2021a。 在Ma…

大数据分析-基于Python的网络爬虫及数据处理---智联招聘人才招聘特征分析与挖掘的算法实现

概要 随着科学技术的发展&#xff0c;人类进入了互联网时代&#xff0c;不仅数据量庞大&#xff0c;而且数据种类繁多&#xff0c;Python简单易学, 语法清晰&#xff0c;在数据操作方面有着一定优势&#xff0c;成为了数据采集和可视化领域的热门语言。本论文主要是使用Python来…

SG5032VAN差分晶振X1G004261001100专用于5G通讯设备

差分晶体振荡器(DXO)是目前行业中公认高技术&#xff0c;高要求的一款晶体振荡器&#xff0c;是指输出差分信号使用2种相位彼此完全相反的信号,从而消除了共模噪声,并产生一个更高性能的系统。差分晶振一般为六脚贴片晶振&#xff0c;输出类型分为好几种,LVDS&#xff0c;LV-PE…