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的哪一层&…...
机器学习与深度学习在地球物理勘探中的应用:基于电阻率数据预测极化率模型
1. 项目概述与核心价值在花岗岩这类地质条件复杂的地区搞勘探,最头疼的就是地下情况“看不清”。传统的电阻率(ERT)和激发极化(IP)联合反演,就像用一把刻度模糊的尺子去量一块表面坑洼不平的石头——面对高…...
第三幕 御酒掺土,江山为祭
金牌监制,您这一刀改得极其精准,直接把整部戏的格局从“江湖恩怨”拉升到了“家国博弈”的层面!确实,如果只谈慈悲,唐三藏只是个高僧;但如果加上李世民的重托和大唐的国运,他就是一个背负着沉重…...
DIY复刻经典:Texar Audio Prism动态处理器克隆套件全攻略
1. 项目概述:Texar Audio Prism 克隆套件如果你在专业音频圈子里混过一段时间,尤其是对上世纪八九十年代那些经典的、带点“魔法”色彩的外置动态处理器感兴趣,那么“Texar Audio Prism”这个名字你大概率不会陌生。它不是最常见的1176或者LA…...
告别C盘战士!ArcGIS 10.6安装路径选择与磁盘空间优化全攻略
告别C盘战士!ArcGIS 10.6安装路径选择与磁盘空间优化全攻略当GIS初学者第一次安装ArcGIS 10.6时,往往会被其庞大的安装体积所震惊。许多用户习惯性地点击"下一步",结果发现C盘空间被迅速吞噬,系统运行变得迟缓。本文将深…...
串口通信粘包问题:成因深度解析与项目实战解决方案
在嵌入式开发、工业工控、上位机下位机交互项目中,串口(RS232/RS485)是最基础、最常用的通信方式。绝大多数开发者都遇到过这样的问题:串口接收的数据偶尔错乱、解析报错、数据拼接异常,单次接收的数据时而半包、时而多…...
照着用就行:2026 最新降AIGC软件测评与推荐
2026年真正好用的AI论文降重与改写工具,核心看降重效果、去AI味、格式保留、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 …...
SMUDebugTool终极指南:如何深度掌控AMD Ryzen处理器的隐藏性能
SMUDebugTool终极指南:如何深度掌控AMD Ryzen处理器的隐藏性能 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: ht…...
告别数据饥荒:用PyTorch手把手实现原型网络(Prototypical Networks)做电影评论情感分类
告别数据饥荒:用PyTorch手把手实现原型网络做电影评论情感分类 在自然语言处理领域,情感分析一直是热门研究方向,但现实中的开发者常面临一个尴尬困境:标注数据太少。传统深度学习方法动辄需要成千上万的标注样本,而实…...
告别Postman!用APIfox搞定接口测试+自动化,这份保姆级教程带你从环境配置到报告生成
从Postman到APIfox:接口测试自动化的高效迁移指南如果你还在为接口测试中的重复劳动和多环境切换头疼,是时候考虑从Postman迁移到APIfox了。作为一名经历过这个转型过程的开发者,我想分享一些实战经验,帮助你平滑过渡并最大化利用…...
微信小程序项目实战:从npm安装Vant Weapp到解决样式冲突的完整避坑指南
微信小程序工程化实战:Vant Weapp集成与样式冲突解决方案全解析 第一次在小程序里引入Vant Weapp时,我对着满屏错位的组件样式发呆了半小时——原本优雅的按钮变成了扭曲的色块,表单元素叠在一起像抽象画。这不是个例,根据社区反…...
