后端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); // 调用父类的构造方法}// 子类重写父类方法@Overridepublic 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 {@Overridepublic 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 sounddog.sound();     // 输出:Bark}
}

输出

Some generic animal sound
Bark

分析

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

6. 继承的常见误区

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

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

误区 2:继承层级过深

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


7. 总结

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

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

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

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

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

相关文章

java项目之网上租贸系统源码(springboot+mysql+vue)

风定落花生,歌声逐流水,大家好我是风歌,混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的网上租贸系统。项目源码以及部署相关请联系风歌,文末附上联系信息 。 项目简介: 基于Spring Boot的网上租贸…

协方差矩阵

协方差矩阵是一个对称矩阵,用来描述多个随机变量之间的协方差关系。协方差反映了两个随机变量如何共同变化的趋势,协方差矩阵将这种关系扩展到了多维数据。 1. 定义 假设有一个 n 维随机向量 ,协方差矩阵 Σ 定义为: 其中&#…

spring boot controller放到那一层

在 Spring Boot 应用程序中,Controller 层通常被放置在应用程序的 表示层(Presentation Layer) 或 用户界面层(UI Layer) 中。Controller 层的主要职责是处理用户的 HTTP 请求,并将请求转发给服务层进行业务…

计算机网络之---局域网

什么叫局域网 局域网(LAN,Local Area Network) 是指在一个相对较小的区域内,如家庭、办公室、学校、企业等,连接多个计算机和设备的网络。局域网的特点是覆盖范围小、传输速度快、构建成本较低。 局域网的主要特点&…

Spring Boot + Jasypt 实现application.yml 属性加密的快速示例

Jasypt(Java Simplified Encryption)是一个专为Java应用程序设计的开源加密库,旨在简化加密和解密流程,保护敏感数据如密码、API密钥等。 jasypt-spring-boot-starter允许开发者在Spring Boot应用中轻松地实现加密和解密功能。 本篇介绍使用 jasypt-spring-boot-starter 以…

HarmonyOS开发:传参方式

一、父子组件传参 1、父传子(Prop方式) 父组件代码 Entry Component struct ParentComponent {State parentMessage: string Hello from Parent;build() {Column() {ChildComponent({ message: this.parentMessage });}} } 子组件代码 Component s…

deepin系统下开放指定端口

一、安装ufw 若已安装则跳过 sudo apt-get install ufw二、查看防火墙状态 sudo ufw status三、打开防火墙 sudo ufw enable四、开放端口 sudo ufw allow 6654/tcp五、windows下测试远程端口 telnet 192.168.1.22 6654六、关闭防火墙 sudo ufw disable附上ufw的全部命令…

微信小程序中使用 TypeScript 定义组件时,Component 函数确实需要多个类型参数

在微信小程序中使用 TypeScript 定义组件时,Component 函数确实需要多个类型参数,而不仅仅是一个。这些参数包括: Properties:组件的属性(props)类型。 Data:组件的内部数据类型。 Methods&am…

我在广州学 Mysql 系列——与索引相关的练习题

ℹ️大家好,我是练小杰,今天星期二啦,还有三天就是星期五了,为了美好生活奋斗吧朋友们! 本文将学习MYSQL中数据表内容的索引相关练习题目~~ 复习:👉【索引详解】 数据库专栏👉【数据…

通过 route 或 ip route 管理Linux主机路由

目录 一:route 使用说明1、查看路由信息2、删除指定路由3、增加指定路由 二:ip route 使用说明1、查看主机路由2、新增主机路由3、删除主机路由 通过route 或者ip route修改Linux主机路由后属于临时生效,系统重启后就恢复默认值了&#xff0c…

SASS 简化代码开发的基本方法

概要 本文以一个按钮开发的实例,介绍如何使用SASS来简化CSS代码开发的。 代码和实现 我们希望通过CSS开发下面的代码样式,从样式来看,每个按钮的基本样式相同,就是颜色不同。 如果按照传统的方式开发,需要开发btn &…

我用Ai学Android Jetpack Compose之Button

答案来自 通义千问,代码同样需要到Android Studio里实践,才能学会。完整工程代码见文末。 我要学Button,麻烦介绍一下 当然可以!Button 是 Jetpack Compose 中用于创建可点击按钮的 Composable 函数。它提供了丰富的配置选项来定…

flutter 专题三十六 Flutter动态化框架Thresh

一、前言 移动端技术栈自诞生以来,其双端开发成本和发布效率一直广受诟病。为了解决这些问题,前端跨端技术一直在不断尝试,希望能一次开发、多端运行并且能做到快速发布。期间经历了多个技术发展阶段。 第一阶段:以H5为代表&…

NodeJs 箭头函数:`()=>{}` 和 `()=>()` 的区别与使用场景

在 JavaScript 中,箭头函数(Arrow Function)是一种简洁的函数写法,它不仅可以减少代码量,还能避免 this 绑定的问题。然而,箭头函数有两种常见的写法:()>{} 和 ()>()。这两种写法虽然看起…

缓存-Redis-缓存更新策略-主动更新策略-Cache Aside Pattern(全面 易理解)

**Cache-Aside Pattern(旁路缓存模式)**是一种广泛应用于缓存管理的设计模式,尤其在使用 Redis 作为缓存层时尤为常见。该模式通过在应用程序与缓存之间引入一个旁路,确保数据的一致性和高效性。本文将在之前讨论的 Redis 主动更新…

python制作翻译软件

本文复刻此教程:制作属于自己的翻译软件-很简单【Python】_哔哩哔哩_bilibili 一、明确需求(以搜狗翻译为例) (1)网址:https://fanyi.sogou.com/text (2) 数据:翻译内容…

【C++】20.二叉搜索树

文章目录 1. 二叉搜索树的概念2. 二叉搜索树的性能分析3. 二叉搜索树的插入4. 二叉搜索树的查找5. 二叉搜索树的删除6. 二叉搜索树的实现代码7. 二叉搜索树key和key/value使用场景7.1 key搜索场景:7.2 key/value搜索场景:7.3 主要区别:7.4 ke…

vue3探索——使用ref与$parent实现父子组件间通信

在vue3中,可以使用vue3的API defineExpose()函数结合ref或者$parent,实现父子组件数据的传递。 子组件向父组件传递数据defineExpose()和ref 子组件:通过defineExpose() 函数,向外暴露响应式数据或者方法 // src/components/son…

Opencv图片的旋转和图片的模板匹配

图片的旋转和图片的模板匹配 目录 图片的旋转和图片的模板匹配1 图片的旋转1.1 numpy旋转1.1.1 函数1.1.2 测试 1.2 opencv旋转1.2.1 函数1.2.2 测试 2 图片的模板匹配2.1 函数2.2 实际测试 1 图片的旋转 1.1 numpy旋转 1.1.1 函数 np.rot90(kl,k1),k1逆时针旋转9…

重温设计模式--13、策略模式

策略模式介绍 文章目录 策略模式介绍C 代码示例 策略模式是一种行为设计模式,它允许在运行时选择算法的行为。该模式将算法的定义和使用分离开来,使得算法可以独立于使用它的客户端而变化,提高了代码的灵活性和可维护性。 其主要包含以下几个…