当前位置: 首页 > news >正文

JavaSE——抽象类和接口

目录

一 .抽象类

1.抽象类概念

2.抽象类语法

3.抽象类特性

4.抽象类的作用

二. 接口

1.接口的概念

2.语法规则

3.接口的使用

4.接口特性

5.实现多个接口

6.接口间的继承

三.抽象类和接口的区别


一 .抽象类


1.抽象类概念

面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象这样的类就是抽象类;抽象类中不一定有抽象方法,而抽象方法一定在抽象类中。


2.抽象类语法

在Java中,一个类如果被 abstract 修饰称为抽象类,抽象类中被 abstract 修饰的方法称为抽象方法抽象方法不用给出具体的实现体。

public abstract class Shape {abstract public void draw();
abstract void calcArea();
public double getArea(){
return area;}
protected double area; 
}

注意:抽象类也是类,内部可以包含普通方法和属性,甚至构造方法。


3.抽象类特性

1. 抽象类不能直接实例化对象

2. 抽象方法不能是 private修饰的;
3. 抽象方法不能被finalstatic修饰,因为抽象方法要被子类重写;

4. 抽象类必须被继承,并且继承后子类要重写父类中的抽象方法,否则子类也是抽象类,必须要使用 abstract 修饰;
5. 抽象类中不一定包含抽象方法,但是有抽象方法的类一定是抽象类;
6. 抽象类中可以有构造方法,供子类创建对象时,初始化父类的成员变量;

例:


上述程序中抛出的异常都是一些常见的错误,请大家务必要重视!!

public abstract class Shape {public String name;public void eat() {//...}public abstract void draw();
}
abstract class A extends Shape {abstract void test();
}
class C extends A {@Overridevoid test() {//...}@Overridepublic void draw() {//...}
}

上述代码中我们可以看出抽象类必须被继承,并且继承后子类要重写父类中的抽象方法


4.抽象类的作用

抽象类本身不能被实例化, 要想使用, 只能创建该抽象类的子类。 然后让子类重写抽象类中的抽象方法;这里大家肯定会有疑惑,普通的类也可以被继承呀, 普通的方法也可以被重写呀, 为啥非得用抽象类和抽象方法呢?确实如此,但是使用抽象类相当于多了一重编译器的校验。使用抽象类的场景就如上面的代码, 实际工作不应该由父类完成, 而应由子类完成。那么此时如果不小心误用成父类
了, 使用普通类编译器是不会报错的;但是父类是抽象类就会在实例化的时候提示错误, 让我们尽早发现问题。


二. 接口

1.接口的概念

在现实生活中,接口的例子比比皆是,最常见的就是属笔记本电脑上的USB口,电源插座等。电脑的USB口上,可以插:U盘、鼠标、键盘...所有符合USB协议的设备。

通过上述例子可以看出:接口就是公共的行为规范标准,大家在实现时,只要符合规范标准,就可以通用。在Java中,接口可以看成是:多个类的公共规范,是一种引用数据类型


2.语法规则

接口的定义格式与定义的格式基本相同,将class关键字换成 interface 关键字就定义了一个接口.

public interface 接口名称{
// 抽象方法
public abstract void method1(); // public abstract 是固定搭配,可以不写
public void method2();
abstract void method3();}

提示:
1. 创建接口时, 接口的命名一般以大写字母 I 开头。
2. 接口的命名一般使用 "形容词" 词性的单词。
3. 阿里编码规范中约定, 接口中的方法和属性不要加任何修饰符号,保持代码的简洁性。


3.接口的使用

接口不能直接使用,必须要有一个"实现类""实现"该接口,实现接口中的所有抽象方法

public class 类名称 implements 接口名称{// ...
}

注意:子类父类之间是extends 继承关系,类与接口之间是 implements 实现关系。
下面以笔记本电脑使用USB鼠标、USB键盘的例子给大家示例一下:

public interface USB {void openDevice();void closeDevice();
}
public class Mouse implements USB {@Overridepublic void openDevice() {System.out.println("打开鼠标");}@Overridepublic void closeDevice() {System.out.println("关闭鼠标");}public void click(){System.out.println("点击鼠标");}
}
public class KeyBoard implements USB {@Overridepublic void openDevice() {System.out.println("打开键盘");}@Overridepublic void closeDevice() {System.out.println("关闭键盘");}public void inPut(){System.out.println("键盘输入");}
}
public class Computer {public void powerOn(){System.out.println("打开笔记本电脑");}public void powerOff(){System.out.println("关闭笔记本电脑");}public void useDevice(USB usb){usb.openDevice();if(usb instanceof Mouse){Mouse mouse = (Mouse)usb;mouse.click();}else if(usb instanceof KeyBoard){KeyBoard keyBoard = (KeyBoard)usb;keyBoard.inPut();}usb.closeDevice();}
}
public class Test {public static void main(String[] args) {Computer computer = new Computer();computer.powerOn();computer.useDevice(new Mouse());// 使用鼠标设备computer.useDevice(new KeyBoard()); // 使用键盘设备computer.powerOff();}
}

这里我们首先是创建了一个USB接口,然后再分别创建笔记本类,鼠标类,键盘类以及测试类。

4.接口特性

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

2. 接口中每一个方法都是public的抽象方法, 即接口中的方法会被隐式的指定为 public abstract(只能是public abstract,其他修饰符都会报错)

3. 接口中的方法是不能在接口中实现的,只能由实现接口的类来实现,但是如果接口中的方法被default或者static修饰,那么可以有具体的实现。

4. 重写接口中方法时,不能使用默认的访问权限。
5. 接口中可以含有变量,但是接口中的变量会被隐式的指定为 public static final 变量。

6. 接口中不能有静态代码块构造方法
7. 接口虽然不是类,但是接口编译完成后字节码文件的后缀格式也是.class,一个接口对应一个字节码文件。
8. 如果一个类没有实现接口中的所有的抽象方法,则类必须设置为抽象类,如果这个抽象类被继承
那么就得实现所有的没被实现的方法


5.实现多个接口


Java中,类和类之间是单继承的,一个类只能有一个父类,即Java不支持多继承,但是一个类可以实现多个接口。下面通过类来表示一组动物。

public abstract class Animal {public String name;public int age;public Animal(String name, int age) {this.name = name;this.age = age;}public abstract void eat();
}
public interface IFly {void fly();
}
public interface IRunning {void run();
}
public interface ISwimming {void swim();
}
public class Fish extends Animal implements ISwimming{public Fish(String name, int age) {super(name, age);}@Overridepublic void swim() {System.out.println(this.name+"正在游泳...");}@Overridepublic void eat() {System.out.println(this.name+"正在吃鱼粮");}
}
public class Frog extends Animal implements ISwimming,IRunning{public Frog(String name, int age) {super(name, age);}@Overridepublic void run() {System.out.println(this.name + "正在往前跳...");}@Overridepublic void swim() {System.out.println(this.name + "正在游泳...");}@Overridepublic void eat() {System.out.println(this.name + "正在吃昆虫...");}
}
public class Duck extends Animal implements ISwimming,IRunning,IFly{public Duck(String name, int age) {super(name, age);}@Overridepublic void fly() {System.out.println(this.name + "正在飞翔...");}@Overridepublic void run() {System.out.println(this.name + "正在跑...");}@Overridepublic void swim() {System.out.println(this.name + "正在游泳...");}@Overridepublic void eat() {System.out.println(this.name + "正在吃谷物...");}
}

上面的代码展示了 Java 面向对象编程中最常见的用法: 一个类继承一个父类, 同时实现多种接口;继承表达的含义是 is - a 语义, 而接口表达的含义是具有 xxx 特性。
这样设计有什么好处呢? 时刻牢记多态的好处, 让程序猿忘记类型;有了接口之后, 类的使用者就不必关注具体类型,而只关注某个类是否具备某种能力。
 

6.接口间的继承

在Java中,类和类之间是单继承的,一个类可以实现多个接口,接口与接口之间可以多继承。即:用接口可以达到多继承的目的;接口间的继承相当于把多个接口合并在一起。
接口可以继承一个接口,达到复用的效果,使用 extends 关键字。

interface IRunning {
void run();
} 
interface ISwimming {
void swim();
} 
interface IAmphibious extends IRunning, ISwimming {//...
}

这里通过接口继承创建了一个新的接口 IAmphibious


三.抽象类和接口的区别

抽象类和接口都是 Java多态的常见使用方式,都需要重点掌握同时又要认清两者的区别。
核心区别: 抽象类中可以包含普通方法普通字段, 这样的普通方法和字段可以被子类直接使用(不必重写), 而接口中不能包含普通方法, 子类必须重写所有的抽象方法
正如之前写的 Animal 例子,此处的 Animal 中包含一个 name 这样的属性, 这个属性在任何子类中都是存在的;因此此处的 Animal 只能作为一个抽象类, 而不应该成为一个接口。

再次提醒一下,抽象类存在的意义就是为了让编译器更好的校验。

相关文章:

JavaSE——抽象类和接口

目录 一 .抽象类 1.抽象类概念 2.抽象类语法 3.抽象类特性 4.抽象类的作用 二. 接口 1.接口的概念 2.语法规则 3.接口的使用 4.接口特性 5.实现多个接口 6.接口间的继承 三.抽象类和接口的区别 一 .抽象类 1.抽象类概念 在面向对象的概念中,所有的对…...

生成式人工智能 - stable diffusion web-ui安装教程

一、Stable Diffusion WEB UI 屌丝劲发作了,所以本地调试了Stable Diffusion之后,就去看了一下Stable Diffusion WEB UI,网络上各种打包套件什么的好像很火。国内的也就这个层次了,老外搞创新,国内跟着屁股后面搞搞应用层,就叫大神了。 不扯闲篇了,我们这里从git源码直接…...

11-Linux文件系统与日志分析

11.1深入理解Linux文件系统 在处理Liunx系统出现故障时,故障的症状是最易发现。数学LInux系统中常见的日志文件,可以帮助管理员快速定位故障点,并及时解决各种系统问题。 11.1.1 inode与block详解 文件系统通常会将这两部分内容分别存放在…...

mac M1下安装PySide2

在M1下装不了PySide2, 是因为PySide2没有arm架构的包 1 先在M1上装qt5 安装qt主要是为了能用里面的Desinger, uic, rcc brew install qt5 我装完的路径在/opt/homebrew/opt/qt5 其中Designer就是用来设计界面的 rcc用resource compiler, 编绎rc资源文件的, 生成对应的py文件…...

超详解——识别None——小白篇

目录 1. 内建类型的布尔值 2. 对象身份的比较 3. 对象类型比较 4. 类型工厂函数 5. Python不支持的类型 总结: 1. 内建类型的布尔值 在Python中,布尔值的计算遵循如下规则: None、False、空序列(如空列表 [],空…...

C++的MQTT开发:使用Paho的C++接口实现消息发布、订阅、连接RabbitMQ

C Paho实现MQTT消息发布功能 要使用paho的cpp接口实现发布MQTT消息的功能,需要进行以下步骤: 安装paho库:首先从paho官方网站下载并安装paho的C库。可以从https://www.eclipse.org/paho/clients/cpp/ 下载适合操作系统的版本。 创建MQTT客户…...

深度网络学习笔记(二)——Transformer架构详解(包括多头自注意力机制)

Transformer架构详解 前言Transformer的整体架构多头注意力机制(Multi-Head Attention)具体步骤1. 步骤12. 步骤23. 步骤34. 步骤4 Self-Attention应用与比较Self-Attention用于图像处理Self-Attention vs. CNNSelf-Attention vs. RNN Transformer架构详…...

Python 快速查找并替换Excel中的数据

Excel中的查找替换是一个非常实用的功能,能够帮助用户快速完成大量数据的整理和处理工作,避免手动逐一修改数据的麻烦,提高工作效率。要使用Python实现这一功能, 我们可以借助Spire.XLS for Python 库,具体操作如下&am…...

KafkaStream Local Store和Global Store区别和用法

前言 使用kafkaStream进行流式计算时,如果需要对数据进行状态处理,那么常用的会遇到kafkaStream的store,而store也有Local Store以及Global Store,当然也可以使用其他方案的来进行状态保存,文本主要理清楚kafkaStream…...

PowerDesigner导入Excel模板生成数据表

PowerDesigner导入Excel模板生成数据表 1.准备好需要导入的Excel表结构数据,模板内容如下图所示 2.打开PowerDesigner,新建一个physical data model文件,填入文件名称,选择数据库类型 3.点击Tools|Execute Commands|Edit/Run Script菜单或按下快捷键Ctrl Shift X打开脚本窗口…...

STM32 HAL库开发——入门篇(3):OLED、LCD

源自正点原子视频教程: 【正点原子】手把手教你学STM32 HAL库开发全集【真人出镜】STM32入门教学视频教程 单片机 嵌入式_哔哩哔哩_bilibili 一、OLED 二、内存保护(MPU)实验 2.1 内存保护单元 三、LCD 3.1 显示屏分类 3.2 LCD简介 3.3 LCD…...

在Linux中查找文件命令的几种方法

要在Linux中查找文件&#xff0c;可以使用以下几种不同的实现方法&#xff1a; 1. 使用find命令&#xff1a; find <搜索路径> <搜索选项> <搜索条件><搜索路径>&#xff1a;表示要搜索的起始路径&#xff0c;可以是一个具体的目录路径&#xff0c;也…...

【TB作品】MSP430F5529 单片机,温度控制系统,DS18B20,使用MSP430实现的智能温度控制系统

作品功能 这个智能温度控制系统基于MSP430单片机设计&#xff0c;能够实时监测环境温度并根据预设的温度报警值自动调节风扇和加热片的工作状态。主要功能包括&#xff1a; 实时显示当前温度。通过OLED屏幕显示温度报警值。通过按键设置温度报警值。实际温度超过报警值时&…...

立创小tips

立创小tips 原理图中 1-修改图纸属性 保存完&#xff0c;绘制原理图的界面就出现了&#xff0c;然后我们鼠标点击原理图的边缘变成红色就可以高边表格的属性了。 2-鼠标右键可以移动整个原理图 3-查看封装 点击任意一个元器件&#xff0c;在右侧就会显示封装属性&#xff…...

Html/HTML5常用标签的学习

课程目标 项目实战&#xff0c;肯定就需要静态网页。朝着做项目方式去学习静态网页。 01、编写第一个html工程结构化 cssjsimages/imgindex.html 归档存储和结构清晰就可以。 02、HTML标签分类 认知&#xff1a;标签为什么要分类&#xff0c;原因因为&#xff1a;分门别类…...

Tomcat 配置:一文掌握所有要点

引言 Apache Tomcat 是一个流行的开源 Java Servlet 容器和 Web 服务器&#xff0c;广泛用于开发和部署 Java Web 应用程序。正确配置 Tomcat 是确保其性能、安全性和稳定性的关键。本文将详细介绍 Tomcat 的各项配置&#xff0c;帮助您优化和管理 Tomcat 服务器。 一、Tomca…...

git 大文件上传失败 Please remove the file from history and try again.

根据提示执行命令 --- 查找到当前文件 git rev-list --objects --all | grep b24e74b34e7d482e2bc687e017c8ab28cd1d24b6git filter-branch --tree-filter rm -f 文件名 --tag-name-filter cat -- --all git push origin --tags --force git push origin --all --force...

骑砍2霸主MOD开发(14)-进击的巨人

一.巨人 sbyte boneIndex Skeleton.GetBoneIndexFromName(Mission.MainAgent.AgentVisuals.GetSkeleton().GetName(), "r_hand"); cp Mission.MainAgent.AgentVisuals.AddPrefabToAgentVisualBoneByRealBoneIndex("p_sword_a", boneIndex); float agent…...

Android 可拖拽的View,限制在父布局中随意拖拽;拖拽结束后可左右吸边;

实现方法一&#xff1a;自定义View 可随意拖动拖拽的View&#xff0c;限制拖动范围是父布局中&#xff1b; import android.content.Context; import android.util.AttributeSet; import android.util.Log; import android.view.MotionEvent; import android.view.ViewGroup; …...

逐步更新动画混合参数(Blend)使其平滑地过渡到目标值

1.具体实现 逐步更新一个动画混合参数&#xff08;Blend&#xff09;&#xff0c;使其平滑地过渡到目标值&#xff0c;可以实现角色动作的平滑过渡&#xff0c;比如从走路过渡到跑步。 private float currentBleng;private float targetBlend;public float accelerSpeed 5;//…...

【多模态/CV】图像数据增强数据分析和处理

note 多模态大模型训练前&#xff0c;图片数据处理的常见操作&#xff1a;分辨率调整、网格畸变、水平翻转、分辨率调整、随机crop、换颜色、多张图片拼接、相似图片检测并去重等 一、分辨率调整 from PIL import Image def resize_image(original_image_path, save_image_p…...

代码随想录——修建二叉搜素树(Leetcode669)

题目链接 递归 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val val; }* TreeNode(int val, TreeNode left, TreeNode right) {* …...

EasyExcel导出多个sheet封装

导出多个sheet 在需求中&#xff0c;会有需要导出多种sheet的情况&#xff0c;那么这里使用easyexcel进行整合 步骤 1、导入依赖 <dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><d…...

【Python错误】:AttributeError: ‘generator‘ object has no attribute ‘next‘解决办法

【Python错误】&#xff1a;AttributeError: ‘generator’ object has no attribute next’解决办法 在Python中&#xff0c;生成器是一种使用yield语句的特殊迭代器&#xff0c;它允许你在函数中产生一个值序列&#xff0c;而无需一次性创建并返回整个列表。然而&#xff0c;…...

如何配置Feign以实现服务调试

1、引入依赖 在项目中&#xff0c;需要引入Spring Cloud OpenFeign的依赖。这通常是通过在pom.xml文件中添加相应的Maven依赖来完成的。例如&#xff1a; <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starte…...

pc之间的相互通信详解

如图&#xff0c;实现两台pc之间的相互通信 1.pc1和pc2之间如何进行通讯。 2.pc有mac和ip&#xff0c;首先pc1需要向sw1发送广播&#xff0c;sw1查询mac地址表&#xff0c;向router发送广播&#xff0c;router不接受广播&#xff0c;router的每个接口都有ip和mac&#xff0c;…...

Mongodb中字段的删除

学习mongodb&#xff0c;体会mongodb的每一个使用细节&#xff0c;欢迎阅读威赞的文章。这是威赞发布的第61篇mongodb技术文章&#xff0c;欢迎浏览本专栏威赞发布的其他文章。 本篇文章&#xff0c;探讨UPDATE中的操作符$unset。Mongodb数据插入后&#xff0c;开发人员使用$u…...

TP8 PHP 动态变量调用 (new $class())->$action($data)

动态&#xff1a; $class \app\table\model\Log; $action DataSave; $data [...]; // 假设这是你要保存的数据//class_exists和method_exists的检查&#xff0c;这段代码能够在尝试实例化类或调用方法之前&#xff0c;先验证类是否存在以及该类中是否存在指定的方法。如果类…...

理解JVM内存模型与Java内存模型(JMM)

理解JVM内存模型与Java内存模型&#xff08;JMM&#xff09; 在Java程序的运行过程中&#xff0c;内存管理和线程的同步是两个重要的概念。本文将深入探讨JVM内存模型&#xff08;Java Virtual Machine Memory Model&#xff09;和JMM&#xff08;Java Memory Model&#xff0…...

鸿蒙OS初识

学习官网&#xff1a;https://www.harmonyos.com/cn/develop 准备 注册&#xff0c;安装软件&#xff08;node:12, DevEco Studio&#xff09;&#xff1a; https://developer.harmonyos.com/cn/docs/documentation/doc-guides/software_install-0000001053582415#ZH-CN_TOP…...

酒店网站可以怎么做/江门关键词优化公司

补充资料&#xff1a;测试结果可接受性的检查和最终测试结果的确定测试结果可接受性的检查和最终测试结果的确定check of the acceptability of test results and determination of the final test resultC凡(3)二3.3d&#xff0c;时&#xff0c;取此3个结果的平均值作为最终侧…...

wordpress建企业站教程/培训心得体会100字

这篇文章主要介绍了python集合删除多种方法详解,文中通过示例代码介绍的非常详细&#xff0c;对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下删除指定的元素A{a,c,b,d,e}print("原集合&#xff1a;",A)A.remove(a) # 不存在会报错print("删除…...

织梦dedecms网站更换域名后文章图片路径批量修改/软件制作

利用springmvc接收前台ajax传过来的数据完成注册功能。为了方便把&#xff0c;前台js的model和后台的user写成一致的功能。代码如下前端&#xff1a;var User function() {var id null;var name null;var password null;var sex null;var telephone null;var role null;…...

企业网站开发外包/可以投放广告的网站

为什么80%的码农都做不了架构师&#xff1f;>>> 1.批量注释 用“#”可以注释一行&#xff0c;想要注释整段的便捷方法可以采用“EOF”&#xff1a; : << COMMENTBLOCK#your shell code... COMMENTBLOCK 这个用来注释整段脚本代码。 : 是shell中的空语句。 …...

石狮网站建设公司/网络公司优化关键词

常用电平标准(TTL、CMOS、LVTTL、LVCMOS、ECL、PECL、LVPECL、RS232)现在常用的电平标准有TTL、CMOS、LVTTL、LVCMOS、ECL、PECL、LVPECL、RS232、RS485等&#xff0c;还有一些速度比较高的LVDS、GTL、PGTL、CML、HSTL、SSTL等。下面简单介绍一下各自的供电电源、电平标准以及使…...

bing网站收录/网站优化策略分析论文

简单的问答已经实现了,那么问题也跟着出现了,我不能确定问题一定是"你叫什么名字",也有可能是"你是谁","你叫啥"之类的,这就引出了人工智能中的另一项技术:自然语言处理(NLP) : 大概意思就是 让计算机明白一句话要表达的意思,NLP就相当于计算机在…...