Java面向对象之接口和抽象类的区别一目了然

image

介绍

相信对于Java面向对象部分,很多人很长一段时间对于接口和抽象类的区别,使用场景都不是很熟悉,同是作为抽象层重要的对象,工作中到底什么情况下使用抽象类,不是很清楚。本文就一次性把这些概念一次性说清楚,不用再烦恼了,哈哈!

核心概念

  1. 接口与抽象类最明显的区别可能就是使用上的惯用方式。接口的典型使用是代表一个类的类型或一个形容词,如 Runnable 或 Serializable,而抽象类通常是类层次结构的一部分或一件事物的类型,如 String 或 ActionHero。

  2. java8开始增加默认方法的极具说服力的理由是它允许在不破坏已使用接口的代码的情况下,在接口中增加新的方法。默认方法有时也被称为守卫方法或虚拟扩展方法。

  3. 抽象类仍然是一个类,在创建新类时只能继承它一个。而创建类的过程中可以实现多个接口。

  4. 有一条实际经验:尽可能地使用接口而不是抽象类。只有当必要时才使用抽象类。除非必须使用,否则不要用接口和抽象类。大多数时候,普通类已经做得很好,如果不行的话,再移动到接口或抽象类中。

  5. 任何抽象性都应该是由真正的需求驱动的。当有必要时才应该使用接口进行重构,而不是到处添加额外的间接层,从而带来额外的复杂性。恰当的原则是优先使用类而不是接口。从类开始,如果使用接口的必要性变得很明确,那么就重构。接口是一个伟大的工具,但它们容易被滥用。

接口和抽象类的区别

接口和抽象类都是Java中定义行为的方式,但它们之间存在一些重要的区别。

image

  1. 定义与实现

接口:接口是一种完全抽象的类型,它只包含抽象方法和常量。接口不能被实例化,只能被类实现。一个类可以实现多个接口。抽象类:抽象类是一个不完全的类,它可以包含抽象方法和非抽象方法。抽象类不能被直接实例化,需要通过子类来继承并实现所有抽象方法。一个类只能继承一个抽象类。

  1. 方法与变量

接口:接口中只能定义抽象方法(从Java 8开始也可以定义默认方法和静态方法),所有方法默认都是public的。接口中定义的变量默认是public static final的。抽象类:抽象类中可以定义普通方法、抽象方法、静态方法、构造方法等,方法默认是public或protected的。抽象类中的变量可以是任何访问修饰符。

  1. 继承与实现

接口:一个类可以实现多个接口,通过关键字implements。抽象类:一个类只能继承一个抽象类,通过关键字extends

代码示例

接口

package com.demo.java.test.javacore;interface CanFight {void fight();
}interface CanSwim {void swim();
}interface CanFly {void fly();
}class ActionCharacter {public void fight2(){System.out.println("ActionCharacter fighting");}
}class Hero extends ActionCharacter implements CanFight, CanSwim, CanFly {public void swim() {System.out.println("swiming");}public void fly() {System.out.println("flying");}@Overridepublic void fight() {System.out.println("fighting");}
}public class Adventure {public static void t(CanFight x) {x.fight();}public static void u(CanSwim x) {x.swim();}public static void v(CanFly x) {x.fly();}public static void w(ActionCharacter x) {x.fight2();}public static void main(String[] args) {Hero h = new Hero();t(h); // Treat it as a CanFightu(h); // Treat it as a CanSwimv(h); // Treat it as a CanFlyw(h); // Treat it as an ActionCharacter}
}

  • 输出:

fighting
swiming
flying
ActionCharacter fighting

抽象类

以乐器类抽象举例,请看继承关系图

image

package com.demo.java.test.javacore;
// 音符枚举
enum Note{MIDDLE_C
}/***  乐器*/
abstract class Instrument {private int i; // Storage allocated for eachpublic abstract void play(Note n);public String what() {return "Instrument";}public abstract void adjust();
}/***  管乐器*/
class Wind extends Instrument {@Overridepublic void play(Note n) {System.out.println("Wind.play() " + n);}@Overridepublic String what() {return "Wind";}@Overridepublic void adjust() {System.out.println("Adjusting Wind");}
}/***  打击乐器*/
class Percussion extends Instrument {@Overridepublic void play(Note n) {System.out.println("Percussion.play() " + n);}@Overridepublic String what() {return "Percussion";}@Overridepublic void adjust() {System.out.println("Adjusting Percussion");}
}/***  有弦乐器*/
class Stringed extends Instrument {@Overridepublic void play(Note n) {System.out.println("Stringed.play() " + n);}@Overridepublic String what() {return "Stringed";}@Overridepublic void adjust() {System.out.println("Adjusting Stringed");}
}/***  铜管乐器*/
class Brass extends Wind {@Overridepublic void play(Note n) {System.out.println("Brass.play() " + n);}@Overridepublic void adjust() {System.out.println("Adjusting Brass");}
}class Woodwind extends Wind {@Overridepublic void play(Note n) {System.out.println("Woodwind.play() " + n);}@Overridepublic String what() {return "Woodwind";}
}/***  音乐组合类*/
public class Music4 {static void tune(Instrument i) {i.play(Note.MIDDLE_C);}static void tuneAll(Instrument[] e) {for (Instrument i: e) {tune(i);}}public static void main(String[] args) {// 向上转型Instrument[] orchestra = {new Wind(),new Percussion(),new Stringed(),new Brass(),new Woodwind()};// 演凑tuneAll(orchestra);}
}

  • 输出:

Wind.play() MIDDLE_C
Percussion.play() MIDDLE_C
Stringed.play() MIDDLE_C
Brass.play() MIDDLE_C
Woodwind.play() MIDDLE_C

文章转载自:一锤子技术员

原文链接:https://www.cnblogs.com/wikiman/p/18036728

体验地址:引迈 - JNPF快速开发平台_低代码开发平台_零代码开发平台_流程设计器_表单引擎_工作流引擎_软件架构

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

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

相关文章

K线实战分析系列之八:十字星——容易识别的特殊形态

K线实战分析系列之八:十字星——容易识别的特殊形态 一、十字启明星和十字黄昏星二、弃婴底部形态和弃婴顶部形态三、总结十字启明星和十字黄昏星形态的要点 一、十字启明星和十字黄昏星 当开盘价与收盘价极为接近的时候,当期的K线就呈现为一根十字线&am…

微服务Springcloud智慧工地APP源码 AI人工智能识别 支持多工地使用

目录 一、现状描述 二、行业难点 APP端功能 一、项目人员 二、视频监控 三、危大工程 四、绿色施工 五、安全隐患 AI智能识别 环境监测 实名制管理 智慧监测 智慧工地全套解决方案 一、现状描述 建筑工程建设具有明显的生产规模大宗性与生产场所固定性的特点。建…

【C++练级之路】【Lv.9】【STL】stack类和queue类的模拟实现

快乐的流畅:个人主页 个人专栏:《C语言》《数据结构世界》《进击的C》 远方有一堆篝火,在为久候之人燃烧! 文章目录 一、容器适配器二、stack2.1 push2.2 pop2.3 top2.4 size2.5 empty 三、queue3.1 push3.2 pop3.3 front3.4 back…

Flutter中高级JSON处理:使用json_serializable进行深入定制

Flutter中高级JSON处理 使用json_serializable库进行深入定制 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at: https://jclee95.blog.csdn.netEmail: 291148484163.com. Shenzhen ChinaAddress of this article:https://blog.csdn.net/qq_28550263/article/details/1363…

与实体展厅相比,VR虚拟展厅都有哪些优点呢?

如今,VR虚拟展厅越来越常见了,本身所具有的许多特点和优势,也在行业应用中逐渐得以展示。VR虚拟展厅具有高度沉浸感和交互性,参观者可以身临其境地感受展品的细节以及质感,仿佛置身于真实的展厅之中。那么VR虚拟展厅都…

C++-带你走进多态(1)

1. 多态的概念 1.1 概念 多态的概念:通俗来说,就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会产生出不同的状态。 举个栗子:比如买票这个行为,当普通人买票时,是全价买票&am…

[Openwrt]IPQ4019 openwrt系统升级解压软件包之后,删除压缩包文件内存占用空间不释放问题分析及解决方案

环境说明 qsdk11 openwrt-15.05版本,IPQ4019 问题描述 IPQ4019 上传固件到系统tmp目录下,解压升级有概率出现升级失败,固件打包为IPQ4019-nand.tar.bz2,复现步骤 使用tar -xvf IPQ4019-nand.tar.bz2,解压出ipq4019-nand.img固件 删除rm -rf IPQ4019-nand.tar.bz2 会概率…

vue3 增加全局水印(显示登录信息)

一、纯文字水印 在main.ts页面里面 加入以下代码: // 导入 Vue 的 createApp 函数 import { createApp } from vue;// 导入全局样式文件 import ./style.css;// 导入根组件 App.vue import App from ./App.vue;// 导入路由配置 import router from ./router;// 使…

非线性优化资料整理

做课题看了一些非线性优化的资料,整理一下,以方便查看: 优化的中文博客 数值优化|笔记整理(8)——带约束优化:引入,梯度投影法 (附代码)QP求解器对比对于MPC的QP求解器 数值优化| 二次规划的…

数据结构之数组

一、定义 数组(Array)是一种用连续的内存空间存储相同数据类型数据的线性数据结构。 二、内存结构 1.创建数组 我们创建一个数组 int[] array {22,33,88,66,55,25} ,在内存结构如下图所示: 首先创建了array数组,会…

Jquery操作DOM对象

文章目录 前言一、pandas是什么?二、使用步骤 1.引入库2.读入数据总结 本章目标 使用Jquery操作网页元素使用JQuery操作文本与属性值内容使用JQuery操作DOM节点使用Jquery遍历DOM节点使用JQuery操作CSS-DOM 一.DOM操作分类 二.JQuery中的DOM操作 内容操作 HTML代码…

硬件工程师入门基础知识(二)片式电阻、片式网络电阻标识和焊接使用注意事项

片式电阻、片式网络电阻标识和使用注意事项 1.概述2.阻值标识2.1 标识原则2.2片式类电阻、片式电阻网络标识方法2.3电阻网络标识方法 3.电阻产品包装3.1片式电阻、片式电阻网络的包装3.2电阻网络的包装 4.使用注意事项4.1 片式电阻推荐焊盘尺寸4.2片式电阻网络推荐焊盘尺寸 5.焊…