理解java特性:抽象类和接口

抽象类

抽象类的意义何在?
表面上看抽象类就是其中的抽象方法 不写方法体 只写一个方法声明:

public abstract void eat();

这个eat方法 在基类中是一个抽象概念 不知道动物要吃什么 动物是一个总体概念

所以继承它的子类必须实现这个方法 把抽象变为具体

public abstract class Animal {@Setter@Getterprivate String name = "动物";@Setter@Getterprivate int age;@Setter@Getterprivate String color;public void show(){System.out.println("这是一个动物");}public abstract void eat();
}

那么这里引申出几个问题:

  • 你会发现抽象类中是可以有其他非抽象的东西的 比如一般的属性 方法等等
  • 如果出现抽象方法 那么它的类必须也带上 abstract 这是一个死规则
  • 抽象类是不能实例化 不能创建对象的 比如你这样写
    Animal a = new Animal();
    是会报错的,原因也很简单 因为它里面可能有抽象方法 抽象方法里面什么都没有 就一个声明 无法被调用 因为java不允许你直接实例化抽象类

最后回到最初的问题 抽象类的意义在哪里呢? 好像你不写抽象方法eat ,继承动物的猫狗类中 也照样可以写各自的eat方法
比较官方的回答是:

提供了一种约束和规范:抽象类可以定义一些方法的签名但不提供具体的实现,这些方法留给子类去实现。这样一来,子类必须实现这些抽象方法,从而使得子类在设计和实现时具有一定的规范和约束,确保了程序的结构和行为的一致性。实现了代码复用和继承:通过继承抽象类,子类可以继承抽象类中定义的方法和属性,从而实现了代码的复用。这种继承机制使得子类可以在基类的基础上进行扩展和定制,同时避免了重复编写相似的代码。面向抽象编程:抽象类可以被视为一种抽象的概念,它定义了一个通用的模板或接口,而不涉及具体的实现细节。这样一来,程序员可以针对抽象类编程,而不需要关心具体的子类实现细节,从而提高了代码的灵活性和可维护性。实现了多态性:由于抽象类可以被子类继承并实现其抽象方法,因此可以通过父类类型引用指向子类对象,从而实现多态性。这种多态性使得代码更加灵活,能够在运行时根据对象的实际类型来调用相应的方法,从而实现了更加动态和可扩展的程序设计。

接口

接口的概念很简单,很抽象类很相似 为了照顾新手 也写一个例子:

// 定义一个接口
interface Animal {void makeSound(); // 接口中的方法只有方法签名,没有方法体
}// 实现接口的类
class Dog implements Animal {@Overridepublic void makeSound() {System.out.println("Dog barks");}
}class Cat implements Animal {@Overridepublic void makeSound() {System.out.println("Cat meows");}
}public class Main {public static void main(String[] args) {Animal dog = new Dog(); // 通过接口类型引用指向实现类的对象Animal cat = new Cat(); // 同上dog.makeSound(); // 调用接口中定义的方法cat.makeSound(); // 同上}
}

这里注意:

  • 我们之前讲多态的时候 说个继承关系可以多态 子类对象指向父类引用,这里发现接口也可以多态!
  • 接口是行为规则定义 所以它里面没有 成员属性 比如动物的 name age type, 只能有常量!final修饰 意味着不能改
  • 接口中没有构造方法! 因为接口是行为规则的定义 而不是某个对象的定义

正确的理解区分抽象类和接口

这部分才是重点,新手往往都会疑惑一个事情 抽象类和接口有什么区别? 好像看着差不多

这里有一个重要的理解: 抽象类是定义的抽象, 而接口是行为的抽象。

怎么理解呢?

比如基类动物 继承类 猫 狗 牛 鸟

这时候出现一个吃eat方法, 这时候应该用抽象类还是接口???

答案是抽象类 因为吃是动物的一个基础属性 是个动物都会吃 不存在 不吃东西的动物,所以它放入抽象类中

如果出现一个飞fly方法, 这时候应该用哪个

答案是接口 因为飞是不是一个基础属性 而是一个选择性的行为 有的动物会飞 有的动物不会飞 那么会飞的动物就实现飞的接口就可以了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/751038.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

springboot278基于JavaWeb的鲜牛奶订购系统的设计与实现

鲜牛奶订购系统的设计与实现 摘 要 如今社会上各行各业,都喜欢用自己行业的专属软件工作,互联网发展到这个时候,人们已经发现离不开了互联网。新技术的产生,往往能解决一些老技术的弊端问题。因为传统鲜牛奶订购信息管理难度大&…

VMwareWorkstation16与Ubuntu 22.04.6 LTS下载与安装

一、准备工作 VMware Workstation Pro 16官网下载: https://customerconnect.vmware.com/cn/downloads/info/slug/desktop_end_user_computing/vmware_workstation_pro/16_0。下载需要账号登录。 二、安装 双击exe文件稍等一会会弹出安装程序,如图 这…

FUTR3D论文实验环境配置及运行

项目地址:https://github.com/Tsinghua-MARS-Lab/futr3d 论文地址:https://arxiv.org/abs/2203.10642 环境:Linux、cuda 11.1、python 3.8 1.创建虚拟环境futr conda create -n futr python3.8 -y conda activate futr2.安装pytorch的GPU版本…

Vue中nextTick一文详解

什么是 nextTick? 在 Vue 中,当我们修改数据时,Vue 会自动更新视图。但是,由于 JavaScript 的事件循环机制,我们无法立即得知视图更新完成的时机。这时候,我们就需要使用 nextTick 来获取视图更新完成后的…

Spring Boot(六十八):SpringBoot 整合Apache tika 实现文档内容解析

1 Apache Tika 介绍 Apache Tika 是一个开源的内容检测和分析框架,由Apache软件基金会开发和维护的顶级项目。它可以从各种格式的文件中提取元数据和文本内容。Tika非常适合处理全文搜索、内容分析、翻译、内容提取等需要大量处理和分析文档内容的任务。Apache Tika提供了多种…

Airtest-Selenium升级兼容Selenium 4.0,给你全新体验!

一、前言 在上期更新推文中提到,我们Airtest-Selenium更新到了1.0.6版本,新增支持Selenium4.0的语法,那么我们来看一下Airtest-Selenium更新后有什么新的内容吧~ 二、selenium 4.0有什么新功能 selenium4.0最主要的还是定位元素方法的更新…

力扣--最小覆盖子串--双端队列+滑动窗口

滑动窗口思路(双端队列实现): 可以参考一下:力扣hot8---滑动窗口-CSDN博客以及力扣hot9---滑动窗口-CSDN博客。 使用滑动窗口有以下几个步骤:初始化双端队列(将s的前t_len个元素入队,此时检验是…

spring源码分析-事务的底层源码-1

这里写自定义目录标题 spring事务的源码分析阅读spring事务源码的前置知识JDBC的事务spring当中和事务相关的对象spring应用程序编码spring事务的源码如何开始研究spring源码当中如何代理bean spring事务的源码分析 最近在研究seata;看了一下spring当中的事务有一点…

第十三届蓝桥杯(C/C++ 大学B组)

目录 试题 A: 九进制转十进制 试题 B: 顺子日期 试题 C: 刷题统计 试题 D: 修剪灌木 试题 E: X 进制减法 试题 F: 统计子矩阵 试题 G: 积木画 试题 H: 扫雷 试题 I: 李白打酒加强版 试题 J: 砍竹子 试题 A: 九进制转十进制 九进制正整数 ( 2022 )转换成十进制等于多…

Hypermesh碰撞安全之安全带缠绕建模

进入安全带建模(Analysis→safety→belt routing) ①肩带的创建 注:end types: 表示2D和1D单元的过渡方式 ②腰带的创建 ③修改接触系数

鸿蒙Harmony应用开发—ArkTS声明式开发(容器组件:Tabs)

通过页签进行内容视图切换的容器组件,每个页签对应一个内容视图。 说明: 该组件从API Version 7开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 该组件从API Version 11开始默认支持安全区避让特性(默认值为&#x…

【老旧小区用电安全谁能管?】安科瑞智慧用电安全管理系统解决方案

行业背景 电气火灾指由电气故障引发的火灾。每年以30%的比例高居各类火灾原因之首。以50%到80%的比例高居重特大火灾之首。已成为业界重点关注的对象并为此进行着孜孜不倦的努力。 国务院安委会也于2017年5月至2020年4月年开展了为期3年的电气火灾综合治理工作。在各界努力的…

HJ212协议C#代码解析实现

HJ212协议C#代码解析实现 HJ212协议是环保中一个非常重要的标准协议(字符串协议),之前写了两篇C HJ212协议解析的相关博文: 环保 HJ212协议解析基于Qt5.14.2的HJ212 TCP服务端接收解析入库程序 最近在学习C#,所以打算…

Liunx系统部署服务应用常用的命令操作

根目录下文件夹的用途 在 Linux 系统中,各个文件夹有着明确的目的和用途。基于您提供的列表,以下是这些文件夹的基本解释: bin: 存放二进制可执行文件,这些是普通用户和系统管理员常用的基本命令和应用程序。 boot: 包含启动 Li…

人工智能的发展与未来

人工智能(Artificial Intelligence,简称 AI)是一门极富挑战性的科学,它涉及计算机科学、控制论、信息论、语言学、神经生理学、心理学、数学、哲学等多种学科的相互渗透。人工智能的研究课题广泛,旨在让机器学会思考&a…

开启clas小猫咪后hosts解析失效不起作用

问题描述 开发网站时经常将域名某个域名,如abc.com写入hosts文件将域名解析劫持到127.0.0.1,方便本地测试用。 但在开启小猫咪clas后,hosts失效,访问了域名指向的真实ip。这种情况是引文dns解析被接管,导致hosts不能使…

蓝桥杯刷题|01普及-真题

目录 [蓝桥杯 2013 省 B] 翻硬币 题解 题目背景 题目描述 输入格式 输出格式 输入输出样例 说明/提示 代码及思路 [蓝桥杯 2015 省 B] 移动距离 题目描述 输入格式 输出格式 输入输出样例 说明/提示 代码及思路 [蓝桥杯 2021 国 BC] 大写 题目描述 输入格式 输…

接口幂等性问题和常见解决方案

接口幂等性问题和常见解决方案 1.什么是接口幂等性问题1.1 会产生接口幂等性的问题1.2 解决思路 2.接口幂等性的解决方案2.1 唯一索引解决方案2.2 乐观锁解决方案2.3 分布式锁解决方案2.4 Token解决方案(最优方案) 3 Token解决方案落地3.1 token获取、token校验3.2 自定义注解,…

小蓝的漆房——算法思路

题目链接:1.小蓝的漆房 - 蓝桥云课 (lanqiao.cn) 本题只要是通过枚举的方法,算出涂成每一种颜色所需的天数,最后在所有天数中找出最小值(由题可知,最多只有60种颜色,所以可以尝试算出每种颜色所需的时间&am…

如何降低云计算成本?

降低云计算成本的方法有很多,以下是一些关键的策略和建议: 优化资源使用: 自动缩放:根据工作负载的需求自动调整计算资源的大小。对于不需要大量扩展的低优先级工作负载,可以设置性能限制,并在适当的情况下…