13、Java 基础-抽象类、接口

news/2025/6/2 21:58:19

一、抽象类

使用abstract修饰符修饰的类。

官方点的定义就是:如果一个类没有包含足够多的信息来描述一个具体的对象,这样的类就是抽象类。

抽象类在实际应用中,更多的是因为类中有抽象方法。抽象方法:只声明,不实现。具体的实现由继承它的子类来实现。实际点就是:被abstract修饰的方法,只有方法名没有方法实现,具体的实现要由子类实现。方法名后面直接跟一个分号,而不是花括号。例如:

public abstract int A();

一个类中含有抽象方法(被abstract修饰),那么这个类必须被声明为抽象类(被abstract修饰)。

public abstract class Bird{ // 定义一个抽象类abstract void walk();
}public abstract class Airplane{ // 定义一个抽象类abstract void run();
}

和普通类的区别主要有:

  • 抽象方法必须为public或者protected(因为如果为private,则不能被子类继承,子类便无法实现该方法),缺省情况下默认为public,class面前加abstract标识
  • 抽象类不能用来创建对象
  • 如果一个类继承于一个抽象类,则子类必须实现父类的所有抽象方法。如果子类没有实现父类的抽象方法,则必须将子类也定义为为abstract类。不具有实现接口功能

相同点大致有:

  • 都有静态变量和静态方法
  • 可以有非静态的变量和方法
  • 可以继承

二、接口

官方定义:接口在java中是一个抽象类型,是抽象方法的集合。一个类通过继承接口的方式,从而继承接口的抽象方法。

从定义上看,接口是个集合,并不是类。类描述了属性和方法,而接口只包含方法(未实现的方法)。接口和抽象类一样不能被实例化,因为不是类。但是接口可以被实现(使用 implements 关键字)。实现某个接口的类必须在类中实现该接口的全部方法。虽然接口内的方法都是抽象的(和抽象方法很像,没有实现)但是不需要abstract关键字。

  • 接口中没有构造方式(因为接口不是类)
  • 接口中的方法必须是抽象的(不能实现)
  • 接口中除了static、final变量,不能有其他变量
  • 接口支持多继承(一个类可以实现多个接口)

和抽象类的区别为:

  • 抽象类可以提供成员方法的实现细节,而接口中只能存在public abstract 方法;
  • 抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是public static final类型的;
  • 抽象类可以有静态代码块和静态方法,而接口中不能含有静态代码块以及静态方法;
  • 一个类只能继承一个抽象类,而一个类却可以实现多个接口。
  • 抽象方法比接口速度快。

举例:鸟和飞机都具有飞的功能,但是他们并不是同一类事物,所以对于这中“功能”的抽象,我们应该用接口实现,虽然我们定义成抽象类也能实现。

public interface Fly{ // 定义一个接口void fly();
}public abstract class Bird{ // 定义一个抽象类abstract void walk();
}public abstract class Airplane{ // 定义一个抽象类abstract void run();
}

同时,鸟有自己的走方法,飞机有跑方法,这是这一类事物的抽象,子类都具有,所以我们此时定义为抽象类最合适不过
我们再看燕子和战斗机的类:

public class Swallow extends Bird implement Fly{ Swallow类继承了Bird类,并对Fly接口进行了实现void fly(){};void walk(){};
}// Battleplaneextends继承了Airplane类,并对Fly接口进行了实现
public class Battleplaneextends Airplane implement Fly{ void fly(){};void run(){};
}
  • 抽象类侧重某一类事物抽象,接口侧重某一种功能抽象

更多代码示例地址:Day13

文章来源:https://blog.csdn.net/sinat_33924041/article/details/90445735
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:https://dhexx.cn/news/show-3590673.html

相关文章

mingw 构建 gdal 2.1.2

目录 1、准备2、生成Makefile3、编译4、编译遇到错误及解决办法1、生成静态库时候ar提示参数列表太长2、生成动态库时候g提示参数列表太长前两日有人在oschian上问我mingw编译gdal的一些问题,然后我简单的编译了一次,记录下编译过程。 此文是2017年5月写…

14、Java 基础-异常处理

Java 异常处理 异常处理是java中很重要的部分,我们平时写代码其实有很多情况考虑不到,或者我考虑到这一行代码有可能会报错我就要想如果报错了我怎么去处理他能让他正常的返回信息给我。程序一旦发生了异常,就会直接在异常代码地方直接退出程…

flashbackup

要启用数据库的闪回功能,需要配置一下参数: SQL> show parameter db_recovery NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ db_recovery_file_dest…

将非分区表转换为分区表

将非分区表转换为分区表方法有好多种,以其中一种举例: .交换分区: 1. 创建分区表,假设有 2 个分区,P1,P2. 2. 创建表 A 存放 P1 规则的数据。 3. 创建表 B 存放 P2 规则的数据。 4. 用表 A 和 P1 …

1、FFmpeg 安装

一、FFmpeg 的安装 1、Linux 安装 FFmpeg # 下载 wget https://ffmpeg.org/releases/ffmpeg-4.2.tar.bz2# 解压 tar -zxvf ffmpeg-4.2.tar.bz2# 编译安装 ./configure --enable-shared --prefix/usr/local/ffmpeg make make installecho "/usr/local/ffmpeg/lib" …

写博客的好处

最近看的书比较多,特别是在《软技能之代码之外的生存指南》,里面有一句话讲的是写博客的好处: 博客有一个好处是你无法轻易抹杀的——提高你的沟通技巧。组织自己的思想,并将其转化为文字,是一项颇具难度却也极具价值的…

段收缩的方法

如何体现表的水位线呢?oracle没有这样的参数,可以通过表里面的行所占的数据块(blocks)来间接反映 SQL> create table hr.huang as select * from dba_objects; 用sys用户给hr创建一张表 切换到hr用户 SQL> select TABLE_…

2、FFmpeg 参数简介

1、通用参数 参数参数描述-ffmt指定格式(音频或视频格式)-ifilename指定输入文件名(文件、设备、网址)-y覆盖已有文件-tduration指定时长-fsLimit_size设置文件大小-ssTime_off从指定的时间(秒,相对视频开始时间的偏移量)-re按照帧率发送-map指定输出文件的流映射关…

Windows 10系统下的科研环境搭建

关注九天学者微信公众号(扫码关注)第一时间获取技术贴更新! 微软最近两年情怀不断,除了推出神器vscode以外,还有win 10下的基于Ubuntu等linux发行版的sub system功能。sub system可谓是弥补了程序员对win系统的排斥心理,至少作者是…

oracle redo相关知识

来自辛明老师: 1.redo的作用 保证数据库的事务可以被重演,从而使得在故障之后,数据可以被恢复。 2.redo功能的实现 redo log buffer lgwr redo log file 3.redo log详解 change vector(改变向量):对数…