继承多态语法糖

抽象类(通用)

子类继承父类方法后,这个子类对象如果执行方法的话,只要子类重写了就执行子类的,不执行父类的。

/**
 * 功能:
 * 作者:IT伟
 * 日期:2025/1/13 19:20
 */
// 抽象类 A
abstract class A {
    // 构造函数
    A() {
        System.out.println("类 A 的构造函数。");
    }

    // 抽象方法
    abstract void abstractMethod();

    // 非抽象方法
    public void nonAbstractMethod() {
        System.out.println("这是抽象类 A 的非抽象方法。");
    }
}


// 抽象类 B 继承抽象类 A
abstract class B extends A {
    // 重写抽象方法
    B() {
        System.out.println("类 B 的构造函数。");
    }
    @Override
    public void abstractMethod() {
        System.out.println("抽象类 B 实现了抽象类 A 的抽象方法。");
    }

    public void callNonAbstractMethod() {
        // 调用 自己重写的 的非抽象方法 如果自己没重写,就调用上一级父类的
        nonAbstractMethod();
    }

    @Override
    public void nonAbstractMethod() {
        System.out.println("类 B 的非抽象方法。");
    }
}

// 类 C 继承抽象类 B
class C extends B {
    C() {
        System.out.println("类 C 的构造函数。");
    }
    @Override
    public void abstractMethod() {
        System.out.println("类 C 重写了B的抽象方法(B重写A)。");
    }
}

// 测试类
public class Main {
    public static void main(String[] args) {
        // 实例化类 C 没有显式地实例化抽象类 B
        C c = new C();
        System.out.println("---------");
        // 调用非抽象方法 实际上调用了B(因为C没有 B才有)
        c.callNonAbstractMethod();
        System.out.println("---------");
        // 调用重写的抽象方法 C有,就调用C的了 如果C没有就调用B的
        c.abstractMethod();
    }
}

 

在 Java 中,当子类重写了父类的方法后,如果通过子类的实例调用该方法,默认执行的是子类重写后的版本,而不是父类的版本。这是方法重写(Override)的核心特性之一,称为运行时多态(Runtime Polymorphism)动态绑定(Dynamic Binding)

以下是关键点:

  1. 子类对象优先执行子类的方法:当子类重写了父类的方法,调用方法时会优先执行子类的版本。
  2. 通过父类引用调用子类对象:即使用父类的引用指向子类对象,调用的方法仍然是子类重写后的版本。

注意事项1

  • 如果方法在父类中是 finalstatic,子类不能重写,调用时将直接执行父类的版本。
  • 构造方法不能被重写,但可以通过继承实现相关逻辑。

 

注意事项2

  1. 抽象类的特性
    • 抽象类可以有构造函数,但不能直接实例化。
    • 抽象方法必须在子类中实现,除非子类也是抽象类。(看我的示例,A作为抽象基类,不能实现抽象方法)
  2. 抽象方法
    • 只能声明,不能有方法体。
    • 子类必须实现所有未实现的抽象方法。
  3. 非抽象方法
    • 抽象类中可以包含普通方法(非抽象方法),这些方法可以直接在抽象类或子类中调用。

接口:

关键点

  1. 抽象类的必要性

    • 如果类 B 没有实现接口 A 的所有抽象方法,就必须声明为 abstract
    • 抽象类不能直接实例化,但可以用来组织和实现部分逻辑。
  2. 实现类的职责

    • C 必须实现 method2,因为 B 没有实现它。(理解就行)
  3. 接口的契约

    • 接口是一个契约,表示实现类必须提供方法的具体实现,除非这个实现类也是抽象类。

 

 

/**
 * 功能:
 * 作者:IT伟
 * 日期:2025/1/13 19:20
 */
// 接口 A
interface A {
    // 抽象方法
    void abstractMethod();

    // 默认方法
    default void nonAbstractMethod() {
        System.out.println("这是接口 A 的默认方法。");
    }
}

// 接口 B 继承接口 A
interface B extends A {
    @Override
    default void abstractMethod() {
        System.out.println("接口 B 实现了接口 A 的抽象方法。");
    }

    default void callNonAbstractMethod() {
        // 调用非抽象方法
        nonAbstractMethod();
    }

    @Override
    default void nonAbstractMethod() {
        System.out.println("接口 B 的默认方法。");
    }
}

// 类 C 实现接口 B
class C implements B {
    C() {
        System.out.println("类 C 的构造函数。");
    }

    @Override
    public void abstractMethod() {
        System.out.println("类 C 重写了接口 B 的抽象方法。");
    }
}

// 测试类
public class Main {
    public static void main(String[] args) {
        // 实例化类 C
        C c = new C();
        System.out.println("---------");
        // 调用非抽象方法 实际上调用了接口 B(因为接口 C 没有实现,使用了接口 B 的默认方法)
        c.callNonAbstractMethod();
        System.out.println("---------");
        // 调用重写的抽象方法 C 有,就调用 C 的;如果 C 没有,就调用 B 的默认实现
        c.abstractMethod();
    }
}

 拓展:反射调用方法

通过反射动态获取抽象类实现,调用实现类中方法,JAVA通过反射动态获取接口所有实现类并实例化,Spring用map接收注入实现类_java 调用抽象类的实例方法-CSDN博客

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MarS:一个由生成基础模型驱动的金融市场模拟引擎

“MARS: A FINANCIAL MARKET SIMULATION ENGINE POWERED BY GENERATIVE FOUNDATION MODEL” 项目主页:https://mars-lmm.github.io/ 论文地址:https://arxiv.org/pdf/2409.07486 Github地址:https://github.com/microsoft/MarS/ 摘要 生成…

macOS 使用 FreeRDP 远程访问 Windows:完整指南20250109

🖥️ macOS 使用 FreeRDP 远程访问 Windows:完整指南 引言 随着远程办公需求的快速增长,跨平台远程管理已经成为不可或缺的技能之一。作为一款开源轻量的远程桌面协议实现工具,FreeRDP 为 macOS 用户提供了一个简单、高效的解决…

两分钟解决 :![rejected] master -> master (fetch first) , 无法正常push到远端库

目录 分析问题的原因解决 分析问题的原因 在git push的时候莫名遇到这种情况 若你在git上修改了如README.md的文件。由于本地是没有README.md文件的,所以导致 远端仓库git和本地不同步。 将远端、本地进行合并就可以很好的解决这个问题 注意:直接git pu…

计算机图形学【绘制立方体和正六边形】

工具介绍 OpenGL:一个跨语言的图形API,用于渲染2D和3D图形。它提供了绘制图形所需的底层功能。 GLUT:OpenGL的一个工具库,简化了窗口创建、输入处理和其他与图形环境相关的任务。 使用的函数 1. glClear(GL_COLOR_BUFFER_BIT |…

springboot高校教室资源管理平台

Spring Boot高校教室资源管理平台是一个基于Spring Boot框架开发的高校教室资源管理系统。 一、平台背景与意义 随着高校规模的不断扩大,教室资源的管理变得日益复杂。传统的管理方式往往依赖于人工记录和纸质文件,不仅效率低下,而且容易出…

[笔记] 使用 Jenkins 实现 CI/CD :从 GitLab 拉取 Java 项目并部署至 Windows Server

随着软件开发节奏的加快,持续集成(CI)和持续部署(CD)已经成为确保软件质量和加速产品发布的不可或缺的部分。Jenkins作为一款广泛使用的开源自动化服务器,为开发者提供了一个强大的平台来实施这些实践。然而…

正点原子STM32F103战舰版电容触摸键学习

一、tpad.h代码 #ifndef __TPAD_H #define __TPAD_H#include "./SYSTEM/sys/sys.h"/******************************************************************************************/ /* TPAD 引脚 及 定时器 定义 *//* 我们使用定时器的输入捕获功能, 对TPAD进行检…

JVM:ZGC详解(染色指针,内存管理,算法流程,分代ZGC)

1,ZGC(JDK21之前) ZGC 的核心是一个并发垃圾收集器,所有繁重的工作都在Java 线程继续执行的同时完成。这极大地降低了垃圾收集对应用程序响应时间的影响。 ZGC为了支持太字节(TB)级内存,设计了基…

zerox - 使用视觉模型将 PDF 转换为 Markdown

7900 Stars 478 Forks 39 Issues 17 贡献者 MIT License Python 语言 代码: https://github.com/getomni-ai/zerox 主页: OmniAI. Automate document workflows 更多AI开源软件:AI开源 - 小众AI zerox基于视觉模型 API 服务,提供了将 PDF 文档转化为 Mar…

JAVA:Spring Boot 集成 JWT 实现身份验证的技术指南

1、简述 在现代Web开发中,安全性尤为重要。为了确保用户的身份,JSON Web Token(JWT)作为一种轻量级且无状态的身份验证方案,广泛应用于微服务和分布式系统中。本篇博客将讲解如何在Spring Boot 中集成JWT实现身份验证…

[论文阅读] (35)TIFS24 MEGR-APT:基于攻击表示学习的高效内存APT猎杀系统

《娜璋带你读论文》系列主要是督促自己阅读优秀论文及听取学术讲座,并分享给大家,希望您喜欢。由于作者的英文水平和学术能力不高,需要不断提升,所以还请大家批评指正,非常欢迎大家给我留言评论,学术路上期…

目标检测中的Bounding Box(边界框)介绍:定义以及不同表示方式

《------往期经典推荐------》 一、AI应用软件开发实战专栏【链接】 项目名称项目名称1.【人脸识别与管理系统开发】2.【车牌识别与自动收费管理系统开发】3.【手势识别系统开发】4.【人脸面部活体检测系统开发】5.【图片风格快速迁移软件开发】6.【人脸表表情识别系统】7.【…

openEuler22.03系统使用Kolla-ansible搭建OpenStack

Kolla-ansible 是一个利用 Ansible 自动化工具来搭建 OpenStack 云平台的开源项目,它通过容器化的方式部署 OpenStack 服务,能够简化安装过程、提高部署效率并增强系统的可维护性。 前置环境准备: 系统:openEuler-22.03-LTS-SP4 配置&…

Leecode刷题C语言之统计重新排列后包含另一个字符串的子字符串数目②

执行结果:通过 执行用时和内存消耗如下: void update(int *diff, int c, int add, int *cnt) {diff[c] add;if (add 1 && diff[c] 0) {// 表明 diff[c] 由 -1 变为 0(*cnt)--;} else if (add -1 && diff[c] -1) {// 表明 diff[c] 由 0 变为 -…

uniapp 微信小程序webview与h5双向实时通信交互

描述: 小程序webview内嵌的h5需要向小程序实时发送消息,有人说postMessage可以实现,所以试验一下,结果是实现不了实时,只能在特定时机后退、组件销毁、分享时小程序才能接收到信息(小程序为了安全等考虑做了…

pycharm-pyspark 环境安装

1、环境准备:java、scala、pyspark、python-anaconda、pycharm vi ~/.bash_profile export SCALA_HOME/Users/xunyongsun/Documents/scala-2.13.0 export PATH P A T H : PATH: PATH:SCALA_HOME/bin export SPARK_HOME/Users/xunyongsun/Documents/spark-3.5.4-bin…

fast-crud select下拉框 实现多选功能及下拉框数据动态获取(通过接口获取)

教程 fast-crud select示例配置需求:需求比较复杂 1. 下拉框选项需要通过后端接口获取 2. 实现多选功能 由于这个前端框架使用逻辑比较复杂我也是第一次使用,所以只记录核心问题 环境:vue3,typescript,fast-crud ,elementPlus 效果 代码 // crud.tsx文件(/.ts也行 js应…

高性能现代PHP全栈框架 Spiral

概述 Spiral Framework 诞生于现实世界的软件开发项目是一个现代 PHP 框架,旨在为更快、更清洁、更卓越的软件开发提供动力。 特性 高性能 由于其设计以及复杂精密的应用服务器,Spiral Framework框架在不影响代码质量以及与常用库的兼容性的情况下&a…

天机学堂笔记1

FeignClient(contextId "course", value "course-service") public interface CourseClient {/*** 根据老师id列表获取老师出题数据和讲课数据* param teacherIds 老师id列表* return 老师id和老师对应的出题数和教课数*/GetMapping("/course/infoB…

lobechat搭建本地知识库

本文中,我们提供了完全基于开源自建服务的 Docker Compose 配置,你可以直接使用这份配置文件来启动 LobeChat 数据库版本,也可以对之进行修改以适应你的需求。 我们默认使用 MinIO 作为本地 S3 对象存储服务,使用 Casdoor 作为本…