【Java 基础篇】Java继承:打开面向对象编程的大门

在这里插入图片描述

继承是面向对象编程(Object-Oriented Programming,OOP)中的一个重要概念。在Java中,继承允许一个类(子类)从另一个类(父类)继承属性和方法。这种机制使得代码重用、扩展和维护变得更加容易。本篇博客将深入探讨Java中继承的概念、语法和最佳实践,适用于初学者,让你轻松理解和运用继承的强大功能。

什么是继承?

继承是面向对象编程的四大基本特征之一,包括封装、继承、多态和抽象。继承允许你创建一个新的类(子类或派生类),该类继承了另一个类(父类或基类)的属性和方法。这意味着子类可以复用父类的代码,并在其基础上进行扩展或修改。

继承的主要优点包括:

  1. 代码重用: 可以重用现有的代码,无需重复编写相同的功能。

  2. 扩展性: 可以在现有类的基础上创建新的类,以满足不同的需求。

  3. 维护性: 如果需要对多个类进行相似的更改,只需更新父类即可。

Java中的继承

在Java中,继承是通过关键字 extends 来实现的。子类继承了父类的属性和方法,可以通过子类对象访问它们。

基本语法

下面是一个简单的继承示例,其中有一个父类 Animal 和一个子类 Dog

class Animal {String name;void eat() {System.out.println(name + " is eating.");}
}class Dog extends Animal {void bark() {System.out.println(name + " is barking.");}
}

在这个示例中,Dog 类继承了 Animal 类。子类 Dog 拥有 Animal 类的属性 name 和方法 eat(),同时还有自己的方法 bark()

访问父类的属性和方法

在子类中,可以使用 super 关键字来访问父类的属性和方法。例如,子类中的 bark() 方法可以通过 super.eat() 来调用父类 Animaleat() 方法。

class Dog extends Animal {void bark() {System.out.println(name + " is barking.");super.eat(); // 调用父类的eat()方法}
}

方法覆盖(Override)

子类可以覆盖(override)父类的方法,这意味着子类可以提供自己的实现版本。覆盖发生在子类中重新定义父类方法的情况下。要覆盖一个方法,子类的方法必须具有相同的名称、返回类型和参数列表。

下面是一个方法覆盖的示例:

class Animal {void makeSound() {System.out.println("Animal makes a sound.");}
}class Dog extends Animal {@Overridevoid makeSound() {System.out.println("Dog barks.");}
}

在这个示例中,Dog 类覆盖了 Animal 类中的 makeSound() 方法,提供了自己的实现。

构造方法的继承

子类可以调用父类的构造方法来初始化从父类继承的属性。在子类的构造方法中使用 super() 调用父类的构造方法。

class Animal {String name;Animal(String name) {this.name = name;}
}class Dog extends Animal {Dog(String name) {super(name); // 调用父类的构造方法}
}

防止继承

有时候,你可能希望阻止某个类被继承,你可以使用 final 关键字来标记这个类。例如:

final class FinalClass {// 类的内容
}

标记为 final 的类不能被继承。

继承的注意事项

在使用继承时,有一些需要注意的事项:

  1. 单一继承: Java中不支持多重继承,一个类只能继承一个父类。这意味着一个类不能同时继承多个类。

  2. 方法覆盖: 子类覆盖父类方法时,必须保持方法名称、返回类型和参数列表的一致性。否则,编译器将会报错。

  3. super关键字: 子类可以使用 super 关键字来访问父类的属性和方法。这在需要调用父类的构造方法或访问父类方法时非常有用。

  4. 构造方法的调用: 子类的构造方法可以调用父类的构造方法,以确保从父类继承的属性得到正确的初始化。

  5. final关键字: 使用 final 关键字可以防止一个类被继承,或者防止一个方法被覆盖。这在某些情况下可以提高代码的安全性和可维护性。

  6. 抽象类和接口: 除了普通的类继承,Java还支持抽象类和接口的继承。抽象类和接口提供了更多的灵活性和多态性。

实例:继承的应用

让我们通过一个实例来演示继承的应用。假设我们正在创建一个简单的图形应用程序,其中有不同类型的图形,如圆形和矩形。我们可以使用继承来创建一个通用的图形类,然后派生出具体的子类。

class Shape {String color;Shape(String color) {this.color = color;}void draw() {System.out.println("Drawing a shape with color " + color);}
}class Circle extends Shape {double radius;Circle(String color, double radius) {super(color);this.radius = radius;}@Overridevoid draw() {System.out.println("Drawing a circle with radius " + radius + " and color " + color);}
}class Rectangle extends Shape {double length;double width;Rectangle(String color, double length, double width) {super(color);this.length = length;this.width = width;}@Overridevoid draw() {System.out.println("Drawing a rectangle with length " + length + ", width " + width + ", and color " + color);}
}

在这个示例中,我们创建了一个通用的 Shape 类,具有颜色属性和绘制方法。然后,我们派生出 CircleRectangle 类,它们继承了 Shape 类的属性和方法,并提供了自己的实现。

下面是如何使用这些类的示例:

public class Main {public static void main(String[] args) {Circle circle = new Circle("Red", 5.0);circle.draw();Rectangle rectangle = new Rectangle("Blue", 4.0, 6.0);rectangle.draw();}
}

这个示例演示了如何使用继承创建一个简单的图形类层次结构,从而实现代码重用和多态性。

总结

继承是Java中的一个重要概念,它允许一个类继承另一个类的属性和方法,从而实现代码的重用和扩展。在使用继承时,需要注意方法覆盖、构造方法的调用、super 关键字等细节。通过合理使用继承,可以更好地组织和管理代码,提高代码的可维护性和可扩展性。

希望本篇博客帮助你理解Java中继承的基本概念和语法。继承是面向对象编程中的核心概念之一,掌握好它将对你的Java编程技能产生积极影响。

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

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

相关文章

算法笔记 近似最近邻查找(Approximate Nearest Neighbor Search,ANN)

1 介绍 精准最近邻搜索中数据维度一般较低,所以会采用穷举搜索,即在数据库中依次计算其中样本与所查询数据之间的距离,抽取出所计算出来的距离最小的样本即为所要查找的最近邻。 当数据量非常大的时候,搜索效率急剧下降。——>…

知识储备--基础算法篇-矩阵

2.矩阵 2.1第54题螺旋矩阵 第一题上来就跪了,看了官方答案感觉不是很好理解,找了一个比较容易理解的。 class Solution(object):def spiralOrder(self, matrix):""":type matrix: List[List[int]]:rtype: List[int]"""…

CG MAGIC分享3d Max中的Corona渲染器材质如何成转换VRay材质?

大家无论是使用Corona渲染器还是Vray渲染器时,进行材质问题时,都会遇到转化材质问题。 如何将CR转换成VR或者将VR转换CR材质呢? 对于这两者之间转换最好最好的方法只能是材质转换器。 CG MAGIC小编,梳理了两种方法,大…

【zookeeper】zookeeper日常运维

本文将分享一些zookeeper在日常使用中一些维护经验。 zookeeper清理快照 脚本或者命令清理 zookeeper长时间运行,快照逐渐增多可能造成服务器磁盘被占满的情况,但我们不能贸然用rm命令删除快照文件,如果直接删完会导致丢失好多数据&#x…

Vision Transformer(VIT 网络架构)

论文下载链接:https://arxiv.org/abs/2010.11929 文章目录 引言1. VIT与传统CNN的比较2. 为什么需要Transformer在图像任务中? 1. 深入Transformer1.1 Transformer的起源:NLP领域的突破1.2 Transformer的基本组成1.2.1 自注意机制 (Self-Atte…

国际网页短信软件平台搭建定制接口说明|移讯云短信系统

国际网页短信软件平台搭建定制接口说明|移讯云短信系统 通道路由功能介绍 支持地区通道分流,支持关键字,关键词通道分流,支持白名单独立通道,支持全网通道分流,支持通道可发地区设置,通道路由分组&#x…

使用VisualStudio制作上位机(六)

文章目录 使用VisualStudio制作上位机(六)第五部分:应用程序打包第一步:勾选为Release模式第二步:生成解决方案第三步:将我们额外添加的文件放入到Release这个文件夹里 使用VisualStudio制作上位机&#xf…

qt day5 数据库,tcp

数据库 widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QSqlDatabase>//数据库管理类 #include <QSqlRecord>//记录类 #include <QSqlQuery>//执行sql语句对应的类 #include <QMessageBox> #include<QDebug> …

MySQL中的索引事务(2)事务----》数据库运行的原理知识+面试题~

本篇文章建议读者结合&#xff1a;MySQL中的索引事务&#xff08;1&#xff09;索引----》数据库运行的原理知识面试题~_念君思宁的博客-CSDN博客此时&#xff0c;如果你根据name来查询&#xff0c;查到叶子节点得到的只是主键id&#xff0c;还需要通过主键id去主键的B树里面在…

ApiPost7使用介绍 | HTTP Websocket

一、基本介绍 创建项目&#xff08;团队下面可以创建多个项目节点&#xff0c;每个项目可以创建多个接口&#xff09;&#xff1a; 参数描述库&#xff08;填写参数时自动填充描述&#xff09;&#xff1a; 新建环境&#xff08;前置URL、环境变量很有用&#xff09;&#x…

C语言中结构体和位段的一些知识

一、结构体 struct stu {char name[20];//20//对齐数为8int age;//4//两个数中最大对齐数为8&#xff0c;而24又是8的整数倍 }; int main () {printf("%d\n", sizeof(struct stu));//只有vs中有对齐数为8&#xff0c;gcc没有对齐数&#xff0c;对齐数为成员变量自…

SpringBoot - Google EventBus、AsyncEventBus

介绍 EventBus 顾名思义&#xff0c;事件总线&#xff0c;是一个轻量级的发布/订阅模式的应用模式&#xff0c;最初设计及应用源与 google guava 库。 相比于各种 MQ 中间件更加简洁、轻量&#xff0c;它可以在单体非分布式的小型应用模块内部使用&#xff08;即同一个JVM范围…

线上问诊:数仓开发(三)

系列文章目录 线上问诊&#xff1a;业务数据采集 线上问诊&#xff1a;数仓数据同步 线上问诊&#xff1a;数仓开发(一) 线上问诊&#xff1a;数仓开发(二) 线上问诊&#xff1a;数仓开发(三) 文章目录 系列文章目录前言一、ADS1.交易主题1.交易综合统计2.各医院交易统计3.各性…

js+html实现打字游戏v2

实现逻辑&#xff0c;看jshtml实现打字游戏v1&#xff0c;在此基础之上增加了从文件读取到的单词&#xff0c;随机选取10个单词。 效果演示 上代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8">&l…

window系统 bat脚本开启和关闭防火墙

前言 手动去关闭和开启防火墙太麻烦 命令 开始防火墙 netsh advfirewall set allprofiles state on关闭防火墙 netsh advfirewall set allprofiles state off

Maven高级

目录 1.分模块设计与开发 2.继承与聚合 ​编辑 3.私服 资源上传和下载 1.分模块设计与开发 将项目按照功能拆分成若干个子模块&#xff0c;方便项目的管理维护、扩展&#xff0c;也方便模块间的相互调用&#xff0c;资源共享。 分模块设计需要先针对模块功能进行设计&…

Python+Requests+Pytest+Excel+Allure 接口自动化测试项目实战【框架之间的对比】

--------UnitTest框架和PyTest框架的简单认识对比与项目实战-------- 定义&#xff1a; Unittest是Python标准库中自带的单元测试框架&#xff0c;Unittest有时候也被称为PyUnit&#xff0c;就像JUnit是Java语言的标准单元测试框架一样&#xff0c;Unittest则是Python语言的标…

MySQL——连接查询与子查询

一、连接查询 单表查询&#xff1a;在一张表当中查询数据&#xff0c;叫做单表查询。 连接查询&#xff0c;结合俩&#xff08;多&#xff09;张表&#xff0c;在俩张&#xff08;多&#xff09;表当中查询数据&#xff0c;在一张表当中查询一部分&#xff0c;在另一张表当中…

5个强大的Java分布式缓存框架推荐

在开发中大型Java软件项目时&#xff0c;很多Java架构师都会遇到数据库读写瓶颈&#xff0c;如果你在系统架构时并没有将缓存策略考虑进去&#xff0c;或者并没有选择更优的缓存策略&#xff0c;那么到时候重构起来将会是一个噩梦。 在开发中大型Java软件项目时&#xff0c;很…

C语言之练习题

欢迎来到我的&#xff1a;世界 希望作者的文章对你有所帮助&#xff0c;有不足的地方还请指正&#xff0c;大家一起学习交流 ! 目录 前言填空题&#xff1a;第一题第二题第三题 编程题&#xff1a;第一题&#xff1a;不用加减乘除做加法第二题&#xff1a;完全数计算第三题&am…