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的哪一层&…...

TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...
Leetcode 3577. Count the Number of Computer Unlocking Permutations
Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接:3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯,要想要能够将所有的电脑解锁&#x…...
Frozen-Flask :将 Flask 应用“冻结”为静态文件
Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是:将一个 Flask Web 应用生成成纯静态 HTML 文件,从而可以部署到静态网站托管服务上,如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...
【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验
系列回顾: 在上一篇中,我们成功地为应用集成了数据库,并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了!但是,如果你仔细审视那些 API,会发现它们还很“粗糙”:有…...

JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作
一、上下文切换 即使单核CPU也可以进行多线程执行代码,CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短,所以CPU会不断地切换线程执行,从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...

【论文阅读28】-CNN-BiLSTM-Attention-(2024)
本文把滑坡位移序列拆开、筛优质因子,再用 CNN-BiLSTM-Attention 来动态预测每个子序列,最后重构出总位移,预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵(S…...
DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”
目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...

Linux --进程控制
本文从以下五个方面来初步认识进程控制: 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程,创建出来的进程就是子进程,原来的进程为父进程。…...

Springboot社区养老保险系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,社区养老保险系统小程序被用户普遍使用,为方…...

网站指纹识别
网站指纹识别 网站的最基本组成:服务器(操作系统)、中间件(web容器)、脚本语言、数据厍 为什么要了解这些?举个例子:发现了一个文件读取漏洞,我们需要读/etc/passwd,如…...