Java从入门到“放弃”(精通)之旅——继承与多态⑧

news2025/4/23 5:56:24

Java从入门到“放弃”(精通)之旅🚀——继承与多态⑧

一、继承:代码复用的利器

1.1 为什么需要继承?

在这里插入图片描述

想象一下我们要描述狗和猫这两种动物。如果不使用继承,代码可能会是这样:

// Dog.java
public class Dog {
    String name;
    int age;
    float weight;
    
    public void eat() {
        System.out.println(name + "正在吃饭");
    }
    
    public void sleep() {
        System.out.println(name + "正在睡觉");
    }
    
    void bark() {
        System.out.println(name + "汪汪汪---");
    }
}

// Cat.java
public class Cat {
    String name;
    int age;
    float weight;
    
    public void eat() {
        System.out.println(name + "正在吃饭");
    }
    
    public void sleep() {
        System.out.println(name + "正在睡觉");
    }
    
    void mew() {
        System.out.println(name + "喵喵喵---");
    }
}

在这里插入图片描述

可以看到,这两个类中有大量重复的代码(name、age、weight属性,eat()和sleep()方法)。继承机制正是为了解决这种代码冗余问题而生的。

1.2 继承的概念

继承是面向对象程序设计使代码可以复用的最重要手段,它允许程序员在保持原有类特性的基础上进行扩展,增加新功能。这样产生的新类称为派生类(子类),被继承的类称为基类(父类)。

继承关系可以用以下图示表示:

        Animal
        /    \
       Dog    Cat

1.3 继承的语法

在Java中使用extends关键字实现继承:

// Animal.java
public class Animal {
    String name;
    int age;
    
    public void eat() {
        System.out.println(name + "正在吃饭");
    }
    
    public void sleep() {
        System.out.println(name + "正在睡觉");
    }
}

// Dog.java
public class Dog extends Animal {
    void bark() {
        System.out.println(name + "汪汪汪---");
    }
}

// Cat.java
public class Cat extends Animal {
    void mew() {
        System.out.println(name + "喵喵喵---");
    }
}

1.4 继承中的成员访问

在继承体系中,子类可以访问父类的成员,但有一些规则需要注意:

  1. 成员变量访问

    • 子类中有,优先访问子类的
    • 子类中没有,访问父类的
    • 都没有,编译报错
  2. 成员方法访问

    • 方法名不同时,优先在子类中找,再到父类中找
    • 方法名相同时,根据参数列表决定(重载)
    • 完全相同时,子类会覆盖父类方法(重写)

1.5 super关键字

当子类和父类有同名成员时,可以使用super关键字显式访问父类的成员:

public class Derived extends Base {
    int a;  // 与父类同名
    
    public void method() {
        super.a = 200;  // 访问父类的a
        this.a = 100;   // 访问子类的a
    }
}

1.6 子类构造方法

子类构造时必须先调用父类构造方法:

public class Base {
    public Base() {
        System.out.println("Base()");
    }
}

public class Derived extends Base {
    public Derived() {
        // 编译器会自动添加super();
        System.out.println("Derived()");
    }
}

注意:

  1. super()必须是子类构造方法的第一条语句
  2. 如果父类没有无参构造,子类必须显式调用父类的有参构造

二、继承方式

在现实生活中,事物之间的关系是非常复杂,灵活多样,比如:
在这里插入图片描述
但在Java中只支持这几种继承方式
在这里插入图片描述

三、多态:灵活的行为表现

2.1 多态的概念

多态是指同一行为在不同对象上表现出不同的形态。例如:

打印机
├─ 彩色打印机 → 打印效果:彩色
└─ 黑白打印机 → 打印效果:黑白

2.2 多态的实现条件

Java中实现多态需要满足三个条件:

  1. 必须在继承体系下
  2. 子类必须重写父类方法
  3. 通过父类引用调用重写的方法

2.3 方法重写(Override)

区别点重写(override)重载(overload)
参数列表一定不能修改必须修改
返回类型不能修改(除非构成父子类关系)可以修改
访问限定符不能做更严格的限制(可以降低限制)可以修改

重载和重写的区别:
在这里插入图片描述

重写是子类对父类方法的重新实现,必须遵循以下规则:

  • 方法名、参数列表必须相同
  • 返回值类型相同或是父类返回值的子类
  • 访问权限不能比父类更严格
  • 不能重写static、private、final方法

示例:

class Animal {
    public void eat() {
        System.out.println("动物吃饭");
    }
}

class Cat extends Animal {
    @Override
    public void eat() {
        System.out.println("猫吃鱼");
    }
}

2.4 向上转型与向下转型

  1. 向上转型:子类对象赋值给父类引用

    Animal animal = new Cat("咪咪", 2);
    
  2. 向下转型:父类引用强制转换为子类类型
    在这里插入图片描述

    if (animal instanceof Cat) {
        Cat cat = (Cat) animal;
        cat.mew();
    }
    

2.5 多态的优缺点

优点

  1. 降低代码复杂度,减少if-else
  2. 提高可扩展性,新增子类不影响现有代码

缺点

  1. 运行效率略低(动态绑定)
  2. 属性没有多态性
  3. 构造方法中调用重写方法可能导致问题

2.6 避免在构造方法中调用重写方法

看一个典型问题:

class B {
    public B() {
        func();  // 危险!
    }
    
    public void func() {
        System.out.println("B.func()");
    }
}

class D extends B {
    private int num = 1;
    
    @Override
    public void func() {
        System.out.println("D.func() " + num);
    }
}

public class Test {
    public static void main(String[] args) {
        D d = new D();  // 输出:D.func() 0
    }
}

此时num还未初始化(值为0),因为父类构造方法执行时子类字段还未初始化。

四、继承与组合的选择

继承表示"is-a"关系,组合表示"has-a"关系。例如:

// 继承:奔驰是汽车
class Benz extends Car {
    // ...
}

// 组合:汽车有发动机、轮胎等
class Car {
    private Engine engine;
    private Tire tire;
    // ...
}

设计原则:优先使用组合,除非明显是"is-a"关系。

五、final关键字

final可以修饰:

  1. 变量:表示常量
  2. 方法:不能被子类重写
  3. 类:不能被继承
final class String {  // String类不可继承
    // ...
}

总结

【使用多态的好处】
能够降低代码的 “圈复杂度”, 避免使用大量的 if - else
什么叫 “圈复杂度” ?
圈复杂度是一种描述一段代码复杂程度的方式. 一段代码如果平铺直叙, 那么就比较简单容易理解. 而如果有很多的条件分支或者循环语句, 就认为理解起来更复杂.因此我们可以简单粗暴的计算一段代码中条件语句和循环语句出现的个数, 这个个数就称为 “圈复杂度”.如果一个方法的圈复杂度太高, 就需要考虑重构.

继承和多态是Java面向对象编程的核心概念,掌握它们对于写出优雅、灵活的代码至关重要。记住:

  • 继承用于代码复用和建立"is-a"关系
  • 多态让程序更灵活、更易扩展
  • 合理使用final可以增强安全性
  • 组合优于继承是良好的设计原则

在这里插入图片描述
JavaSE往期专栏

  • Java从入门到“放弃”(精通)之旅——启航①
  • Java从入门到“放弃”(精通)之旅——数据类型与变量②
  • Java从入门到“放弃”(精通)之旅——运算符③
  • Java从入门到“放弃”(精通)之旅——程序逻辑控制④
  • Java从入门到“放弃”(精通)之旅——方法的使用⑤
  • Java从入门到“放弃”(精通)之旅——数组的定义与使用⑥
  • Java从入门到“放弃”(精通)之旅——类和对象全面解析⑦
    在这里插入图片描述

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

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

相关文章

DeepSeek开源引爆AI Agent革命:应用生态迎来“安卓时刻”

开源低成本:AI应用开发进入“全民时代” 2025年初,中国AI领域迎来里程碑事件——DeepSeek开源模型的横空出世,迅速在全球开发者社区掀起热潮。其R1和V3模型以超低API成本(仅为GPT-4o的2%-10%)和本地化部署能力&#x…

使用 LangChain + Higress + Elasticsearch 构建 RAG 应用

RAG(Retrieval Augmented Generation,检索增强生成) 是一种结合了信息检索与生成式大语言模型(LLM)的技术。它的核心思想是:在生成模型输出内容之前,先从外部知识库或数据源中检索相关信息&…

Self-Ask:LLM Agent架构的思考模式 | 智能体推理框架与工具调用实践

作为程序员,我们习惯将复杂问题分解为可管理的子任务,这正是递归和分治算法的核心思想。那么,如何让AI模型也具备这种结构化思考能力?本文深入剖析Self-Ask推理模式的工作原理、实现方法与最佳实践,帮助你构建具有清晰…

安装 vmtools

第2章 安装 vmtools 1.安装 vmtools 的准备工作 1)现在查看是否安装了 gcc ​ 查看是否安装gcc 打开终端 输入 gcc - v 安装 gcc 链接:https://blog.csdn.net/qq_45316173/article/details/122018354?ops_request_misc&request_id&biz_id10…

【论文阅读20】-CNN-Attention-BiGRU-滑坡预测(2025-03)

这篇论文主要探讨了基于深度学习的滑坡位移预测模型,结合了MT-InSAR(多时相合成孔径雷达干涉测量)观测数据,提出了一种具有可解释性的滑坡位移预测方法。 [1] Zhou C, Ye M, Xia Z, et al. An interpretable attention-based deep…

滑动窗口学习

2090. 半径为 k 的子数组平均值 题目 问题分析 给定一个数组 nums 和一个整数 k,需要构建一个新的数组 avgs,其中 avgs[i] 表示以 nums[i] 为中心且半径为 k 的子数组的平均值。如果在 i 前或后不足 k 个元素,则 avgs[i] 的值为 -1。 思路…

# 基于PyTorch的食品图像分类系统:从训练到部署全流程指南

基于PyTorch的食品图像分类系统:从训练到部署全流程指南 本文将详细介绍如何使用PyTorch框架构建一个完整的食品图像分类系统,涵盖数据预处理、模型构建、训练优化以及模型保存与加载的全过程。 1. 系统概述 本系统实现了一个基于卷积神经网络(CNN)的…

v-html 显示富文本内容

返回数据格式&#xff1a; 只有图片名称 显示不出完整路径 解决方法&#xff1a;在接收数据后手动给img格式的拼接vite.config中的服务器地址 页面&#xff1a; <el-button click"">获取信息<el-button><!-- 弹出层 --> <el-dialog v-model&…

【数学建模】孤立森林算法:异常检测的高效利器

孤立森林算法&#xff1a;异常检测的高效利器 文章目录 孤立森林算法&#xff1a;异常检测的高效利器1 引言2 孤立森林算法原理2.1 核心思想2.2 算法流程步骤一&#xff1a;构建孤立树(iTree)步骤二&#xff1a;构建孤立森林(iForest)步骤三&#xff1a;计算异常分数 3 代码实现…

<项目代码>YOLO小船识别<目标检测>

项目代码下载链接 YOLOv8是一种单阶段&#xff08;one-stage&#xff09;检测算法&#xff0c;它将目标检测问题转化为一个回归问题&#xff0c;能够在一次前向传播过程中同时完成目标的分类和定位任务。相较于两阶段检测算法&#xff08;如Faster R-CNN&#xff09;&#xff0…

Crawl4AI:打破数据孤岛,开启大语言模型的实时智能新时代

当大语言模型遇见数据饥渴症 在人工智能的竞技场上&#xff0c;大语言模型&#xff08;LLMs&#xff09;正以惊人的速度进化&#xff0c;但其认知能力的跃升始终面临一个根本性挑战——如何持续获取新鲜、结构化、高相关性的数据。传统数据供给方式如同输血式营养支持&#xff…

【Spring Boot】MyBatis多表查询的操作:注解和XML实现SQL语句

1.准备工作 1.1创建数据库 &#xff08;1&#xff09;创建数据库&#xff1a; CREATE DATABASE mybatis_test DEFAULT CHARACTER SET utf8mb4;&#xff08;2&#xff09;使用数据库 -- 使⽤数据数据 USE mybatis_test;1.2 创建用户表和实体类 创建用户表 -- 创建表[⽤⼾表…

[Android]豆包爱学v4.5.0小学到研究生 题目Ai解析

拍照解析答案 【应用名称】豆包爱学 【应用版本】4.5.0 【软件大小】95mb 【适用平台】安卓 【应用简介】豆包爱学&#xff0c;一般又称河马爱学教育平台app,河马爱学。 关于学习&#xff0c;你可能也需要一个“豆包爱学”这样的AI伙伴&#xff0c;它将为你提供全方位的学习帮助…

Qt开发:软件崩溃时,如何生成dump文件

文章目录 一、程序崩溃时如何自动生成 Dump 文件二、支持多线程中的异常捕获三、在 DLL 中使用 Dump 捕获四、封装成可复用类五、MiniDumpWriteDump函数详解 一、程序崩溃时如何自动生成 Dump 文件 步骤一&#xff1a;包含必要的头文件 #include <Windows.h> #include …

普罗米修斯Prometheus监控安装(mac)

普罗米修斯是后端数据监控平台&#xff0c;通过Node_exporter/mysql_exporter等收集数据&#xff0c;Grafana将数据用图形的方式展示出来 官网各平台下载 Prometheus安装&#xff08;mac&#xff09; &#xff08;1&#xff09;通过brew安装 brew install prometheus &…

Python SQL 工具包:SQLAlchemy介绍

SQLAlchemy 是一个功能强大且灵活的 Python SQL 工具包和对象关系映射&#xff08;ORM&#xff09;库。它被广泛用于与关系型数据库进行交互&#xff0c;提供了从低级 SQL 表达式到高级 ORM 的完整工具链。SQLAlchemy 的设计目标是让开发者能够以 Pythonic 的方式操作数据库&am…

Shader属性讲解+Cg语言讲解

CPU调用GPU传递数据 修改Render组件的material属性 在脚本中更改游戏物体材质颜色代码示例&#xff1a; using System.Collections; using System.Collections.Generic; using UnityEngine;public class TestFixedColor : MonoBehaviour {void Start(){//创建预制体GameObjec…

基于LightGBM-TPE算法对交通事故严重程度的分析与可视化

基于LightGBM-TPE算法对交通事故严重程度的分析与可视化 原文&#xff1a; Analysis and visualization of accidents severity based on LightGBM-TPE 1. 引言部分 文章开篇强调了道路交通事故作为意外死亡的主要原因&#xff0c;引起了多学科领域的关注。分析事故严重性特…

什么是CRM系统,它的作用是什么?CRM全面指南

CRM&#xff08;Customer Relationship Management&#xff0c;客户关系管理&#xff09;系统是一种专门用于集中管理客户信息、优化销售流程、提升客户满意度、支持精准营销、驱动数据分析决策、加强跨部门协同、提升客户生命周期价值的业务系统工具。其中&#xff0c;优化销售…

MYSQL之库的操作

创建数据库 语法很简单, 主要是看看选项(与编码相关的): CREATE DATABASE [IF NOT EXISTS] db_name [create_specification [, create_specification] ...] create_specification: [DEFAULT] CHARACTER SET charset_name [DEFAULT] COLLATE collation_name 1. 语句中大写的是…