后端Java开发:第十三天

第十三天:继承 - 面向对象的核心概念

欢迎来到第十三天的学习!今天,我们将深入探讨 Java 中的 继承(Inheritance),这是面向对象编程的四大基本特性之一。继承是指一个类(子类)通过继承另一个类(父类)的属性和方法,从而具备父类的功能,同时可以在子类中扩展新的功能。继承是代码复用的核心机制之一,它有助于提高代码的可维护性和可扩展性。

1. 什么是继承?

继承是面向对象编程中的一种机制,它允许我们创建一个新类(子类),这个新类可以继承一个已有类(父类)的一些特性(字段)和行为(方法)。通过继承,子类可以复用父类的代码,同时还可以根据需要扩展或重写父类的方法。

继承的基本原则:

  • 子类继承父类:子类继承了父类的属性和方法,并且可以在子类中新增属性和方法。
  • 方法重写(Overriding):子类可以重新定义父类的某些方法。
  • 单继承:Java 中的类是单继承的,也就是说,每个类只能有一个直接父类。

2. 继承的好处

继承有以下几个重要的好处:

  • 代码复用:继承让我们能够复用父类的代码,避免了重复编写相同的代码。
  • 增强可维护性:由于子类共享父类的代码,如果父类发生了变化,只需要修改父类代码,子类无需改变,从而提高了代码的可维护性。
  • 扩展性:通过继承,我们可以在子类中扩展新的功能,或者重写父类的方法,实现特定需求。

3. 如何实现继承?

在 Java 中,继承的实现通过使用 extends 关键字。子类通过 extends 关键字继承父类的属性和方法。

基本语法
public class 子类 extends 父类 {
    // 子类特有的属性和方法
}
步骤 1:定义父类

首先定义一个父类,包含一些属性和方法。

步骤 2:定义子类

子类通过 extends 关键字继承父类的属性和方法。子类可以使用父类的属性和方法,也可以添加自己独特的属性和方法。

步骤 3:使用父类的构造方法

父类的构造方法可以通过 super() 来调用,子类构造方法可以通过 super 关键字来调用父类的构造器,确保父类的初始化过程。


4. 继承的示例

示例 1:动物类与狗类

在这个例子中,我们有一个 动物类(Animal),它包含基本的属性和行为,然后我们通过继承创建一个 狗类(Dog),它继承了动物类的属性,并扩展了自己特有的方法。

// 父类:Animal
public class Animal {
    private String name;

    // 父类构造方法
    public Animal(String name) {
        this.name = name;
    }

    // 父类方法
    public void speak() {
        System.out.println("Animal makes a sound");
    }

    public String getName() {
        return name;
    }
}

// 子类:Dog
public class Dog extends Animal {
    // 子类构造方法
    public Dog(String name) {
        super(name); // 调用父类的构造方法
    }

    // 子类重写父类方法
    @Override
    public void speak() {
        System.out.println(getName() + " barks");
    }

    public static void main(String[] args) {
        // 创建子类对象
        Dog dog = new Dog("Buddy");
        dog.speak();  // 输出:Buddy barks
    }
}

输出

Buddy barks

分析

  • Dog 继承了 Animal 类,获得了父类的 name 属性和 speak() 方法。
  • Dog 重写了父类的 speak() 方法,使其表现为 “bark”(叫声)。
  • 子类 Dog 使用 super(name) 调用了父类的构造方法来初始化 name 属性。
示例 2:形状类与圆形类

我们再来看一个简单的图形类的例子。假设我们有一个 Shape 类作为父类,代表一个普通的形状。然后我们可以创建一个 Circle 类继承 Shape,表示圆形。

// 父类:Shape
public class Shape {
    private String color;

    public Shape(String color) {
        this.color = color;
    }

    public void draw() {
        System.out.println("Drawing a shape");
    }

    public String getColor() {
        return color;
    }
}

// 子类:Circle
public class Circle extends Shape {
    private double radius;

    // 子类构造方法
    public Circle(String color, double radius) {
        super(color);  // 调用父类的构造方法
        this.radius = radius;
    }

    // 子类方法
    public void draw() {
        System.out.println("Drawing a circle with radius " + radius);
    }

    public static void main(String[] args) {
        // 创建子类对象
        Circle circle = new Circle("Red", 5.0);
        circle.draw();  // 输出:Drawing a circle with radius 5.0
    }
}

输出

Drawing a circle with radius 5.0

分析

  • Circle 类继承了 Shape 类,继承了 color 属性和 draw() 方法。
  • Circle 类通过 super(color) 调用了父类的构造方法。
  • Circle 类重写了 draw() 方法,以实现绘制圆形的特定行为。

5. 方法重写(Method Overriding)

在继承中,子类可以重写(Override)父类的方法。这是一个非常重要的概念,它允许子类在继承父类的基础上修改方法的实现,使其行为符合子类的需求。

重写的规则
  • 子类的方法必须与父类的方法具有相同的名称、返回类型和参数列表。
  • 子类的方法可以有不同的实现。
  • 子类的方法不能减少父类方法的访问权限(即如果父类方法是 public,子类不能将其变为 private)。
重写示例
class Animal {
    public void sound() {
        System.out.println("Some generic animal sound");
    }
}

class Dog extends Animal {
    @Override
    public void sound() {
        System.out.println("Bark");
    }
}

public class Test {
    public static void main(String[] args) {
        Animal animal = new Animal();
        Dog dog = new Dog();
        animal.sound();  // 输出:Some generic animal sound
        dog.sound();     // 输出:Bark
    }
}

输出

Some generic animal sound
Bark

分析

  • Dog 类重写了 sound() 方法,定义了自己特有的行为。
  • 当调用 dog.sound() 时,输出了 Bark,而不是父类的通用行为。

6. 继承的常见误区

误区 1:在子类中随意改变父类的方法实现

继承的目的并不是为了随意修改父类的实现,而是让子类通过重写父类的方法来增强或改变功能。

误区 2:继承层级过深

继承层级过深会导致代码难以维护和理解。尽量避免过度继承,使用组合(composition)来代替继承,减少类的层次结构。


7. 总结

今天我们学习了 继承(Inheritance),它是面向对象编程中最基础也是最重要的特性之一。通过继承,子类可以复用父类的代码,扩展父类的功能,并在需要时重写父类的方法。继承帮助我们减少代码的重复,提高代码的可维护性和可扩展性。

继承是构建 Java 程序的重要工具,但在使用时要注意避免过度继承,并合理设计类的层次结构。

明天我们将继续学习 面向对象编程的其他特性——多态(Polymorphism)。敬请期待!

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

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

相关文章

pygame飞机大战

飞机大战 1.main类2.配置类3.游戏主类4.游戏资源类5.资源下载6.游戏效果 1.main类 启动游戏。 from MainWindow import MainWindow if __name__ __main__:appMainWindow()app.run()2.配置类 该类主要存放游戏的各种设置参数。 #窗口尺寸 #窗口尺寸 import random import p…

c++ 两线交点计算程序(Program for Point of Intersection of Two Lines)

给定对应于线 AB 的点 A 和 B 以及对应于线 PQ 的点 P 和 Q,找到这些线的交点。这些点在 2D 平面中给出,并带有其 X 和 Y 坐标。示例: 输入:A (1, 1), B (4, 4) C (1, 8), D (2, 4) 输出:给定直线 AB 和…

Taro+react 开发第一节创建 带有redux状态管理的项目

Taro 项目基于 node,请确保已具备较新的 node 环境(>16.20.0),推荐使用 node 版本管理工具 nvm 来管理 node,这样不仅可以很方便地切换 node 版本,而且全局安装时候也不用加 sudo 了。 1.安装 npm inf…

2024AAAI SCTNet论文阅读笔记

文章目录 SCTNet: Single-Branch CNN with Transformer Semantic Information for Real-Time Segmentation摘要背景创新点方法Conv-Former Block卷积注意力机制前馈网络FFN 语义信息对齐模块主干特征对齐共享解码头对齐 总体架构backbone解码器头 对齐损失 实验SOTA效果对比Cit…

代码随想录 数组test5(leetcode 59.螺旋矩阵)

59. 螺旋矩阵 II - 力扣(LeetCode) 大致的想法是从起点开始以顺时针走到中心,有两种实现方式:一圈一圈赋值或者每走一步就赋值 方法一:按圈循环 思路: 外层循环是要循环的圈数,这里需要分奇偶讨论,若题目给出的n为偶…

向成电子XC3588H工控主板助力内窥镜应用升级

随着微创手术在全球范围内普及,内窥镜应用越来越广泛。利用内窥镜,医生可以看到X射线不能显示的病变,对医疗诊断有非常重要的作用。内窥镜设备凝聚了先进的影像技术,提供高画像精度诊断微小的病变。在设备智能化的今天&#xff0c…

基于SpringBoot的音乐网站与分享平台

基于SpringBoot的音乐网站与分享平台 摘要1. 研究背景2.研究内容3.系统功能 3.1前台首页功能模块3.2在线听歌功能模块3.3后台登录功能模块3.4在线听歌管理模块 4.部分功能代码实现5.源码分享(免费获取) 需要源码联系我即可(免费获取)~ ??大家点赞、收藏、关注、评论啦 、查…

nginx-灰度发布策略(split_clients)

一. 简述: 基于客户端的灰度发布(也称为蓝绿部署或金丝雀发布)是一种逐步将新版本的服务或应用暴露给部分用户,以确保在出现问题时可以快速回滚并最小化影响的技术。对于 Nginx,可以通过配置和使用不同的模块来实现基于…

【数据结构】栈与队列(FIFO)

在阅读该篇文章之前&#xff0c;可以先了解一下堆栈寄存器和栈帧的运作原理&#xff1a;<【操作系统】堆栈寄存器sp详解以及栈帧>。 栈(FILO) 特性: 栈区的存储遵循着先进后出的原则。 例子: 枪的弹夹&#xff0c;最先装进去的子弹最后射出来&#xff0c;最后装入的子弹…

python基础案例

#一个年份如果能被4整除但不能被 100整除&#xff0c;或能被 400整除&#xff0c;那么这个年份就是闰年。 year int(input(请输入年份&#xff1a;)) if (year %40 and year %100!0) or year %4000:print("这个年份就是闰年") else:print("这个年份不是闰…

微服务框架,Http异步编程中,如何保证数据的最终一致性

一、背景 在微服务框架下&#xff0c;跨服务之间的调用&#xff0c;当遇到操作耗时或者量大的情况&#xff0c;我们一般会采用异步编程实现。 本文出现的问题是&#xff1a;异步回调过来时&#xff0c;却未查询到数据库中的任务&#xff0c;导致未能正常处理回调。 下面是当…

Kafka详解 ③ | Kafka集群操作与API操作

目录 1、Kafka集群操作 1.1、创建 topic 1.2、查看主题命令 1.3、生产者生产 1.4、消费者消费数据 1.5、运行 describe topics命令 1.6、增加 topic分区数 1.7、增加配置 1.8、删除配置 1.9、删除 topic 2、Kafka的Java API操作 2.1、生产者代码 2.2、消费者代 2…

Echarts集成Vue2个人总结与反思

协同净焦水处理系统 统计模块 环境部署 1、创建数据库ry-cloud并导入数据脚本ry_2021xxxx.sql&#xff08;必须&#xff09;&#xff0c;quartz.sql&#xff08;可选&#xff09; 2、创建数据库ry-config并导入数据脚本ry_config_2021xxxx.sql&#xff08;必须&#xff09; …

aardio —— 虚表 —— 模拟属性框

写了个简单的属性框例程&#xff0c;抛砖引玉&#xff0c;期待你做出更丰富强大的功能。 本例演示&#xff1a;折叠子行、选择框、输入文本、输入数值、下拉选择、选择图片、选择颜色、选择字体等功能。 只有想不到&#xff0c;没有做不到&#xff0c;发挥你的想象力吧。 imp…

《Vue3 七》插槽 Slot

插槽可以让组件的使用者来决定组件中的某一块区域到底存放什么元素和内容。 使用插槽&#xff1a; 插槽的使用过程其实就是抽取共性、预留不同。将共同的元素、内容依然留在组件内进行封装&#xff1b;将不同的元素使用 slot 作为占位&#xff0c;让外部决定到底显示什么样的…

Functions

1.trigonometric function 定义和图像 反三角函数是三角函数的反函数 versin(verse -sin)&#xff1a;1/sinx 性质 三角函数的公式 三角恒等式 周期性公式&#xff1a;直接画图记 公式记忆&#xff1a;先想象一个在第一象限的锐角 1&#xff1a;在坐标轴中旋转360 2.sin&am…

微服务-网关、配置热更新、动态路由

祝小伙伴们每天开心 每天都能进步一点点 目录 1 网关路由 1.1 认识网关 什么是网关捏 网关实现方案 1.2 快速入门 &#xff08;1&#xff09;引入依赖 &#xff08;2&#xff09;配置路由 1.3 路由过滤 路由规则语法 常见属性 predicates&#xff08;路由断言&…

uni-app 资源引用(绝对路径和相对路径)方法汇总

文章目录 一、前言&#x1f343;二、绝对路径和相对路径2.1 绝对路径2.2 相对路径 三、引用组件四、引用js4.1 js 文件引入4.2 NPM支持 五、引用css六、引用json6.1 json文件引入 七、引用静态资源7.1 模板内引入静态资源7.2 css 引入静态资源7.3 js/uts 引入静态资源7.4 静态资…

机器学习基础-支持向量机SVM

目录 基本概念和定义 1. 超平面&#xff08;Hyperplane&#xff09; 2. 支持向量&#xff08;Support Vectors&#xff09; 3. 线性可分 4. 边界 SVM算法基本思想和分类 基本思想 间隔最大化 间隔&#xff08;Margin&#xff09; 软边距 SVM 核函数的概念 基本概念…

TypyScript从入门到精通

TypyScript从入门到精通 TypyScript 是什么&#xff1f;增加了什么环境搭建二、为何需要 TypeScript三、编译 TypeScript四、类型声明五、类型推断基本类型六、类型总览JavaScript 中的数据类型TypeScript 中的数据类型1. 上述所有 JavaScript 类型2. 六个新类型&#xff1a;3.…