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

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 对象索引&#xff1…...

追梦之旅【数据结构篇】——详解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的可靠性的同时,传输效率也受到了一定的影响&#xff…...

电子科技大学网络协议(TCP/IP作业答案)--网工(五次作业汇总)

目录 作业1:OSI/RM、TCP/IP编址和底层网络技术 作业2:IP地址规划与路由选择 作业3:ARP、IP、ICMP 作业4:UDP、Routing Protocol 作业五 作业1:OSI/RM、TCP/IP编址和底层网络技术 物理地址属于OSI/RM的哪一层&…...

Kubernetes集群声明式文件YAML

一、YAML介绍 YAML 的意思是:仍是一种标记语言,但为了强调这种语言以数据做为中心,而不是以标记语言为重点。是一个可读性高,用来表达数据序列的格式。 二、基本语法 1.低版本缩进时不允许使用Tab键,只允许使用空格…...

为赋能,创共赢~ 〖TFS_CLUB社区〗-〖星荐官计划〗来袭~ 期待各位小伙伴的加入~

文章目录❤️‍🔥 TFS社区介绍❤️‍🔥 星荐官计划在直播结束之后,有几位小伙伴跟我说,想法是好的,但是会很难搞。试想一下如果真的是很容易做的事情,那岂不是人人都可以做?正因为难做&#xff…...

【华为OD机试模拟题】用 C++ 实现 - 水仙花数(2023.Q1)

最近更新的博客 【华为OD机试模拟题】用 C++ 实现 - 获得完美走位(2023.Q1) 文章目录 最近更新的博客使用说明水仙花数题目输入输出描述示例一输入输出说明示例二输入输出Code使用说明 参加华为od机试,一定要注意不要完全背诵代码,需要理解之后模仿写出,通过率才会高。…...

Windows作为操作系统的典型特征和主要功能

我是荔园微风,作为一名在IT界整整25年的老兵,今天我们来重新审视一下Windows这个我们熟悉的不能再熟悉的系统。我们每天都在用Windows操作系统,但是其实我们每天直接在打交道的并不是Windows操作系统的内核,而是Windows操作系统的…...

【Linux】-- 多线程安全

目录 进程互斥 计算 -> 时序问题 加锁保护 pthread_mutex_lock pthread_mutex_unlock 使用init与destory pthread_mutex_init phtread_mutex_destory 锁的实现原理 图 可重入VS线程安全 死锁 Linux线程同步 条件变量 系统调用 进程互斥 进程线程间的互斥相关…...

Unity Avatar Camera Controller 第一、第三人称相机控制

文章目录简介Variables实现Target PositionTarget RotationOthers简介 本文介绍如何实现用于Avatar角色的相机控制脚本,支持第一人称、第三人称以及两种模式之间的切换,工具已上传至SKFramework框架的Package Manager中: Variables Avatar&…...

SRE中 的SLO,SLI等知识 归纳

SLA Service Level Agreement 服务质量/水平协议SLO Service Level Objective 服务质量/水平目标SLI Services Level Indicator 服务质量/水平指标下面用人、事、物的逻辑进行阐释。人和事用从上到下,从左到右的顺序。客户 - 每 1 个客户在使用产品服务时&…...

MS9123是一款单芯片USB投屏器,内部集成了USB2 0控制器和数据收发模块、视频DAC和音视频处理模块,MS9123可以通过USB接口显示或者扩展PC、

MS9123是一款单芯片USB投屏器,内部集成了USB2.0控制器和数据收发模块、视频DAC和音视频处理模块,MS9123可以通过USB接口显示或者扩展PC、智能手机、平板电脑的显示信息到更大尺寸的显示设备上,支持CVBS、S-Video视频接口。 主要功能特征 C…...

针孔成像模型零基础入门(三)

2020年爆火的Nerf(神经辐射场)横空出世,据说只要用手机拍照,然后喂给模型,就可以生成3D模型了,我试过了,确有此事! 那我们有想过,为什么可以从二维的图片里面获取物体三…...

你真的了解环形队列吗?(学习数据结构必须掌握的模型)

目录 0.前言 1. 什么是环形队列 2. 如何使用数组结构 / 链表结构 对环形队列封装 3. 代码手撕环形队列各个接口 3.1 代表封装一个环形队列 3.2 环形队列的初始化 3.3 环形队列的插入 3.4环形队列的删除 3.5环形队列的判空 3.6环形队列的判满 3.7环形队列的队头 3.8环…...