Java 抽象类和接口
文章目录
- 一、抽象类
- 1. 抽象类定义
- 2. 抽象类成员特点
- 二、接口
- 1. 接口概述
- 2. 接口成员特点
- 3. 类和接口的关系
- 4. 抽象类和接口的区别
- 5. 接口案例
- 三、形参和返回值
一、抽象类
1. 抽象类定义
在 Java 中,一个没有方法体的方法应该定义为抽象方法,而类中如果有抽象方法,则该类必须定义为抽象类。
抽象类关键字:abstract
public abstract class Animal {public abstract void eat();
}
public class Cat extends Animal {//重写抽象方法public void eat() {System.out.println("猫吃鱼!");}
}
抽象类不是具体的,所以不能直接创建对象!
抽象类的特点:
① 抽象类和抽象方法必须使用 abstract 关键字修饰;
② 抽象类中不一定有抽象方法,但有抽象方法的类一定是抽象类;
③ 抽象类不能直接实例化,要想实例化,参照多态的方式,通过子类对象实现实例化,这叫抽象类多态;
④ 抽象类的子类要么重写抽象类中的所有抽象方法,要么自己就是抽象类。
2. 抽象类成员特点
① 抽象类中的成员变量可以是变量,也可以是常量;
② 抽象类有构造方法,但是不能实例化,此处构造方法用于子类访问父类数据的初始化;
③ 可以有抽象方法,限定子类必须完成某些动作,也可以有非抽象方法,提高代码的复用性。
分析问题要从具体到抽象!
二、接口
1. 接口概述
接口就是一种公共的规范标准,只要符合规范标准,大家都可以通用,Java 中的接口更多的体现在对行为的抽象。
接口关键字:Interface
//Jumpping.java,接口package com.zxe;public interface Jumpping {public abstract void jump();
}
//Cat.java,接口的实现类package com.zxe;public class Cat implements Jumpping {public void jump() {System.out.println("喵喵喵跳起来!");}
}
//Test.javapackage com.zxe;public class Test {public static void main(String[] args) {Jumpping c = new Cat();c.jump();Jumpping d = new Dog();d.jump();}
}
Dog 的实现类与 Cat 同理,实例化的过程依然采用多态的方法!
接口的特点:
① 接口用关键字 interface 修饰;
② 接口不能实例化,参照多态的方式,通过实现类对象进行实例化,这叫接口多态;
③ 接口的实现类,要么重写接口中的所有抽象方法,要么自身就是抽象类。
2. 接口成员特点
① 成员变量默认是常量,且只能是常量,默认被 static 修饰;
② 接口没有构造方法,因为接口主要是对行为进行抽象的,是没有具体存在的;
③ 一个类如果没有父类,默认继承 Object 类,访问其无参构造方法;
④ 成员方法只能是抽象方法。
3. 类和接口的关系
(1)类和类是继承关系,只能单继承,但可以多层继承;
(2)类和接口是实现关系,可以单实现,也可以多实现,还可以在继承一个类的同时实现多个接口;
(3)接口和接口是继承关系,可以单继承,也可以多继承。
public class InterImpl implements Inter1, Inter2, Inter3 {
}
4. 抽象类和接口的区别
| 抽象类 | 接口 |
|---|---|
| 可以是常量也可以是变量,有构造方法,有抽象方法,也有非抽象方法,对类抽象,包括属性、行为 | 只能是常量,只有抽象方法,主要是对行为抽象 |

抽象类是对 Door 这一事物的抽象,而接口是对 Alram 报警行为的抽象!
5. 接口案例
//Animal.javapackage com.zxe;public abstract class Animal {private String name;private int age;public Animal() {}public Animal(String name, int age) {this.name = name;this.age = age;}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 abstract void eat();
}
//Jumpping.javapackage com.zxe;public interface Jumpping {public abstract void jump();
}
//Cat.javapackage com.zxe;public class Cat extends Animal implements Jumpping {public Cat() {}public Cat(String name, int age) {super(name, age);}@Overridepublic void eat() {System.out.println("猫爱吃鱼!");}@Overridepublic void jump() {System.out.println("喵喵喵跳起来!");}
}
//Dog.javapackage com.zxe;public class Dog extends Animal implements Jumpping {public Dog() {}public Dog(String name, int age) {super(name, age);}@Overridepublic void eat() {System.out.println("狗爱吃骨头!");}@Overridepublic void jump() {System.out.println("汪汪汪跳起来!");}
}
//Test.javapackage com.zxe;public class Test {public static void main(String[] args) {Cat c = new Cat("加菲猫", 12);System.out.println(c.getName() + ", " + c.getAge());c.eat();c.jump();Dog d = new Dog();d.setName("舔狗");d.setAge(21);System.out.println(d.getName() + ", " + d.getAge());d.eat();d.jump();}
}
在实际开发中,既会有接口的出现,也会有抽象类的出现,在使用的时候我们应使用具体的子类,因为它里面的方法最多。
三、形参和返回值
① 类名作为形参和返回值
方法的形参是类名,其实需要的是该类的对象,方法的返回值是类名,其实返回的是该类的对象。
//Cat是普通类public void useCat(Cat c) {c.eat();
}public Cat getCat() {Cat c = new Cat();return c;
}
② 抽象类名作为形参和返回值
方法的形参是抽象类名,其实需要的是该抽象类的子类对象,方法的返回值是抽象类名,其实返回的是该抽象类的子类对象。
//Animal是抽象类public class AnimalOperator{public void useAnimal(Animal a) {a.eat();}public Animal getAnimal() {Animal a = new Cat();return a;}
}
//Test.javaAnimalOperator ao = new AnimalOperator();
Animal a = new Cat();
ao.useAnimal(a);
Animal a2 = ao.getAnimal();
a2.eat();
因为要传的参数是一个 Animal 对象,而 Animal 类是一个抽象类,它不能直接实例化,所以我们还是通过多态的方式创建它的子类对象,然后作为参数传递进来。
③ 接口名作为参数和返回值
方法的形参是接口名,其实需要的是该接口的实现类对象,方法的返回值是接口名,其实返回的是该接口的实现类对象。
//Jumpping是接口public void useJumpping(Jumpping j) {j.jump();
}public Jumpping getJumpping() {Jumpping j = new Cat();return j;
}
接口与抽象类一样也需借助多态来实现对象的实例化!
相关文章:
Java 抽象类和接口
文章目录一、抽象类1. 抽象类定义2. 抽象类成员特点二、接口1. 接口概述2. 接口成员特点3. 类和接口的关系4. 抽象类和接口的区别5. 接口案例三、形参和返回值一、抽象类 1. 抽象类定义 在 Java 中,一个没有方法体的方法应该定义为抽象方法,而类中如果…...
三行代码让你的git记录保持整洁
前言笔者最近在主导一个项目的架构迁移工作,由于迁移项目的历史包袱较重,人员合作较多,在迁移过程中免不了进行多分支、多次commit的情况,时间一长,git的提交记录便混乱不堪,随便截一个图形化的git提交历史…...
阿里巴巴内网 Java 面试 2000 题解析(2023 最新版)
前言 这份面试清单是今年 1 月份之后开始收集的,一方面是给公司招聘用,另一方面是想用它来挖掘在 Java 技术栈中,还有一些知识点是我还在探索的,我想找到这些技术盲点,然后修复它,以此来提高自己的技术水平…...
网络应用之静态Web服务器
静态Web服务器-返回固定页面数据学习目标能够写出组装固定页面数据的响应报文1. 开发自己的静态Web服务器实现步骤:编写一个TCP服务端程序获取浏览器发送的http请求报文数据读取固定页面数据,把页面数据组装成HTTP响应报文数据发送给浏览器。HTTP响应报文数据发送完…...
IndexDB 浏览器服务器
IndexDB 浏览器服务器 文章部分内容引用: https://www.ruanyifeng.com/blog/2018/07/indexeddb.html https://juejin.cn/post/7026900352968425486#heading-15 基本概念 数据库:IDBDatabase 对象对象仓库:IDBObjectStore 对象索引࿱…...
追梦之旅【数据结构篇】——详解C语言实现链队列
详解C语言实现链队列~😎前言🙌整体实现内容分析💞预备小知识🙌1.链队列头文件编写🙌2.链队列功能文件(Queue.c )编写:🙌1)初始化函数实现2)销毁函…...
SpringMVC - 13 - SpringMVC执行流程
文章目录1、SpringMVC常用组件2、DispatcherServlet初始化过程a>初始化WebApplicationContextb>创建WebApplicationContextc>DispatcherServlet初始化策略3、DispatcherServlet调用组件处理请求a>processRequest()b>doService()c>doDispatch()d>processDi…...
6091: 斐波那契数列
描述一个斐波那契序列,F(0) 0, F(1) 1, F(n) F(n-1) F(n-2) (n>2),根据n的值,计算斐波那契数F(n)。输入输入数据的第一行为测试用例的个数t,接下来为t行,每行为一个整数n(2≤n≤40)。输出…...
任何人均可上手的数据库与API搭建平台
编写API可能对于很多后端开发人员来说,并不是什么难事儿,但如果您主要从事前端功能,那么可能还是有一些门槛。 那么有没有工具可以帮助我们降低编写API的学习门槛和复杂度呢? 今天就来给大家推荐一个不错的开源工具:…...
Ubuntu(虚拟机)的Anaconda 及使用
安装Anaconda 使用firefox打开Ananconda网址Anaconda | The Worlds Most Popular Data Science Platform 下载后有.sh文件: Anaconda3-2022.10-Linux-x86_64.sh 进入所在目录打开终端并输入 $ bash Anaconda3-2022.10-Linux-x86_64.sh 然后开始安装。 对于给…...
Git ---- IDEA集成 GitHub
Git ---- IDEA集成 GitHub1. 设置 GitHub 账号2. 分享工程到 GitHub3. push 推送本地库到远程库4. pull 拉取远程库到本地库5. clone 克隆远程库到本地1. 设置 GitHub 账号 新版的 IDEA 选择之后会自动登录,就不需要设置 token 了。 如果是老版的 IDEA 的话&…...
opencv提取结构化文本总结
扫描文件表格识别 1.识别结构 situation1 有明确表格结构 1.纠正表格偏移角度(获取最大轮廓,计算最小的矩形,变换坐标截取矩形) 获取面积最大轮廓 _, contours, HIERARCHY cv2.findContours(binary, cv2.RETR_EXTERNAL, cv2…...
JVM知识体系学习八:OOM的案例(承接上篇博文,可以作为面试中的案例)
文章目录前言一、概述二、案例二三、案例:方法区内存溢出1、代码:LambdaGC.java2、元空间内存溢出日志3、分析4、疑问*****四、案例:直接内存溢出问题(少见)(尽量不说)五、案例:栈内存溢出问题1…...
Redis的持久化方式
Redis支持两种方式的持久化,一种是RDB方式、另一种是AOF(append-only-file)方式,两种持久化方式可以单独使用其中一种,也可以将这两种方式结合使用。 •RDB:根据指定的规则“定时”将内存中的数据存储在硬…...
【unity游戏制作-mango的冒险】-4.场景二的镜头和法球特效跟随
👨💻个人主页:元宇宙-秩沅 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 本文由 秩沅 原创 收录于专栏:unity游戏制作 ⭐mango的冒险场景二——镜头和法球特效跟随⭐ 文章目录⭐mango的冒险场景二——镜…...
handwrite-1
-------------------- 实现防抖函数(debounce) 防抖函数原理:把触发非常频繁的事件合并成一次去执行 在指定时间内只执行一次回调函数,如果在指定的时间内又触发了该事件,则回调函数的执行时间会基于此刻重新开始计算…...
【一天一门编程语言】Pascal 语言程序设计极简教程
Pascal 语言程序设计极简教程 用 markdown 格式输出答案。 不少于3000字。细分到2级目录。 文章目录 Pascal 语言程序设计极简教程一、Pascal简介1.1 Pascal历史1.2 Pascal的特点1.3 Pascal的应用二、Pascal语言程序设计2.1 Pascal编程环境2.2 Pascal的基本语法2.3 Pascal程序…...
【基础篇0】Linux下ANACONDA与TF-LITE环境配置
0 写在前面:一些摸索与总结 对于Linux系统,我发现不管是电脑x86的Ubuntu还是树莓派arm的raspberry系统,在系统安装完毕后,总是自带一个特定版本的python. 例如我的ubuntu22.04自带的python版本是3.10,而高版本的py…...
TCP协议原理二
文章目录四、滑动窗口二、流量窗口三、拥塞控制四、滑动窗口 前面我们学习了 确认应答,超时重传,连接管理,这些机制都为我们TCP的可靠性提供了保证,当然在保证TCP的可靠性的同时,传输效率也受到了一定的影响ÿ…...
电子科技大学网络协议(TCP/IP作业答案)--网工(五次作业汇总)
目录 作业1:OSI/RM、TCP/IP编址和底层网络技术 作业2:IP地址规划与路由选择 作业3:ARP、IP、ICMP 作业4:UDP、Routing Protocol 作业五 作业1:OSI/RM、TCP/IP编址和底层网络技术 物理地址属于OSI/RM的哪一层&…...
微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】
微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来,Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...
Java如何权衡是使用无序的数组还是有序的数组
在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...
python如何将word的doc另存为docx
将 DOCX 文件另存为 DOCX 格式(Python 实现) 在 Python 中,你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是,.doc 是旧的 Word 格式,而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...
Linux云原生安全:零信任架构与机密计算
Linux云原生安全:零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言:云原生安全的范式革命 随着云原生技术的普及,安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测,到2025年,零信任架构将成为超…...
Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理
引言 Bitmap(位图)是Android应用内存占用的“头号杀手”。一张1080P(1920x1080)的图片以ARGB_8888格式加载时,内存占用高达8MB(192010804字节)。据统计,超过60%的应用OOM崩溃与Bitm…...
关键领域软件测试的突围之路:如何破解安全与效率的平衡难题
在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件,这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下,实现高效测试与快速迭代?这一命题正考验着…...
Python 包管理器 uv 介绍
Python 包管理器 uv 全面介绍 uv 是由 Astral(热门工具 Ruff 的开发者)推出的下一代高性能 Python 包管理器和构建工具,用 Rust 编写。它旨在解决传统工具(如 pip、virtualenv、pip-tools)的性能瓶颈,同时…...
Razor编程中@Html的方法使用大全
文章目录 1. 基础HTML辅助方法1.1 Html.ActionLink()1.2 Html.RouteLink()1.3 Html.Display() / Html.DisplayFor()1.4 Html.Editor() / Html.EditorFor()1.5 Html.Label() / Html.LabelFor()1.6 Html.TextBox() / Html.TextBoxFor() 2. 表单相关辅助方法2.1 Html.BeginForm() …...
华为OD机试-最短木板长度-二分法(A卷,100分)
此题是一个最大化最小值的典型例题, 因为搜索范围是有界的,上界最大木板长度补充的全部木料长度,下界最小木板长度; 即left0,right10^6; 我们可以设置一个候选值x(mid),将木板的长度全部都补充到x,如果成功…...
redis和redission的区别
Redis 和 Redisson 是两个密切相关但又本质不同的技术,它们扮演着完全不同的角色: Redis: 内存数据库/数据结构存储 本质: 它是一个开源的、高性能的、基于内存的 键值存储数据库。它也可以将数据持久化到磁盘。 核心功能: 提供丰…...
