Java继承(extends)简明教程

news2025/2/24 6:36:49

继承是面向对象的三大特征之一。继承和现实生活中的“继承”的相似之处是保留一些父辈的特性,从而减少代码冗余,提高程序运行效率。

Java 中的继承就是在已经存在类的基础上进行扩展,从而产生新的类。已经存在的类称为父类、基类或超类,而新产生的类称为子类或派生类。在子类中,不仅包含父类的属性和方法,还可以增加新的属性和方法。

Java 中子类继承父类的语法格式如下:

修饰符 class class_name extends extend_class {
    // 类的主体
}

其中,class_name 表示子类(派生类)的名称;extend_class 表示父类(基类)的名称;extends 关键字直接跟在子类名之后,其后面是该类要继承的父类名称。例如:

public class Student extends Person{}

Java 的继承通过 extends 关键字来实现,extends 的英文意思是扩展,而不是继承。extends 很好的体现了子类和父类的关系,即子类是对父类的扩展,子类是一种特殊的父类。从这个角度看,使用继承来描述子类和父类的关系是错误的,用扩展更恰当。

那么为什么国内把 extends 翻译为“继承”呢?子类扩展父类之后就可以获得父类的属性和方法,这与汉语中的继承(子类从父类获得一笔财富称为继承)具有相似性。

Java 与 C++ 定义继承类的方式十分相似。Java 用关键字 extends 代替了 C++ 中的冒号(:)。在 Java 中,所有的继承都是公有继承, 而没有 C++ 中的私有继承和保护继承。

类的继承不改变类成员的访问权限,也就是说,如果父类的成员是公有的、被保护的或默认的,它的子类仍具有相应的这些特性,并且子类不能获得父类的构造方法。

例 1

教师和学生都属于人,他们具有共同的属性:姓名、年龄、性别和身份证号,而学生还具有学号和所学专业两个属性,教师还具有教龄和所教专业两个属性。下面编写 Java 程序代码,使教师(Teacher)类和学生(Student)类都继承于人(People)类,具体的实现步骤如下:

1)创建人类 People,并定义 name、age、sex、sn 属性,代码如下:

public class People {
    public String name; // 姓名
    public int age; // 年龄
    public String sex; // 性别
    public String sn; // 身份证号
    public People(String name, int age, String sex, String sn) {
        this.name = name;
        this.age = age;
        this.sex = sex;
        this.sn = sn;
    }
    public String toString() {
        return "姓名:" + name + "\n年龄:" + age + "\n性别:" + sex + "\n身份证号:" + sn;
    }
}

如上述代码,在 People 类中包含 4 个公有属性、一个构造方法和一个 toString() 方法。

2)创建 People 类的子类 Student 类,并定义 stuNo 和 department 属性,代码如下:

public class Student extends People {
    private String stuNo; // 学号
    private String department; // 所学专业
    public Student(String name, int age, String sex, String sn, String stuno, String department) {
        super(name, age, sex, sn); // 调用父类中的构造方法
        this.stuNo = stuno;
        this.department = department;
    }
    public String toString() {
        return "姓名:" + name + "\n年龄:" + age + "\n性别:" + sex + "\n身份证号:" + sn + "\n学号:" + stuNo + "\n所学专业:" + department;
    }
}

由于 Student 类继承自 People 类,因此,在 Student 类中同样具有 People 类的属性和方法,这里重写了父类中的 toString() 方法。

注意:如果在父类中存在有参的构造方法而并没有重载无参的构造方法,那么在子类中必须含有有参的构造方法,因为如果在子类中不含有构造方法,默认会调用父类中无参的构造方法,而在父类中并没有无参的构造方法,因此会出错

3)创建 People 类的另一个子类 Teacher,并定义 tYear 和 tDept 属性,代码如下:

public class Teacher extends People {
    private int tYear; // 教龄
    private String tDept; // 所教专业
    public Teacher(String name, int age, String sex, String sn, int tYear, String tDept) {
        super(name, age, sex, sn); // 调用父类中的构造方法
        this.tYear = tYear;
        this.tDept = tDept;
    }
    public String toString() {
        return "姓名:" + name + "\n年龄:" + age + "\n性别:" + sex + "\n身份证号:" + sn + "\n教龄:" + tYear + "\n所教专业:" + tDept;
    }
}

Teacher 类与 Student 类相似,同样重写了父类中的 toString() 方法。

4)编写测试类 PeopleTest,在该类中创建 People 类的不同对象,分别调用它们的 toString() 方法,输出不同的信息。具体的代码如下:

public class PeopleTest {
    public static void main(String[] args) {
        // 创建Student类对象
        People stuPeople = new Student("王丽丽", 23, "女", "410521198902145589", "00001", "计算机应用与技术");
        System.out.println("----------------学生信息---------------------");
        System.out.println(stuPeople);
        // 创建Teacher类对象
        People teaPeople = new Teacher("张文", 30, "男", "410521198203128847", 5, "计算机应用与技术");
        System.out.println("----------------教师信息----------------------");
        System.out.println(teaPeople);
    }
} 

运行程序,输出的结果如下:

----------------学生信息---------------------
姓名:王丽丽
年龄:23
性别:女
身份证号:410521198902145589
学号:00001
所学专业:计算机应用与技术
----------------教师信息----------------------
姓名:张文
年龄:30
性别:男
身份证号:410521198203128847
教龄:5
所教专业:计算机应用与技术

单继承

Java 语言摒弃了 C++ 中难以理解的多继承特征,即 Java 不支持多继承,只允许一个类直接继承另一个类,即子类只能有一个直接父类,extends 关键字后面只能有一个类名。

例如,如下代码会导致编译错误:

class Student extends Person,Person1,Person2{…}
class Student extends Person,extends Person1,extends Person2{…}

很多地方在介绍 Java 的单继承时,可能会说 Java 类只能有一个父类,严格来讲,这种说法是错误的,应该是一个类只能有一个直接父类,但是它可以有多个间接的父类。例如,Student 类继承 Person 类,Person 类继承 Person1 类,Person1 类继承 Person2 类,那么 Person1 和 Person2 类是 Student 类的间接父类。下图展示了单继承的关系。

从图中可以看出,三角形、四边形和五边形的直接父类是多边形类,它们的间接父类是图形类。

图形类、多边形类和三角形、四边形、五边形类形成了一个继承的分支。在这个分支上,位于下层的子类会继承上层所有直接或间接父类的属性和方法。

如果两个类不在同一个继承树分支上,就不会存在继承关系,例如多边形类和直线。

如果定义一个 Java 类时并未显式指定这个类的直接父类,则这个类默认继承 java.lang.Object 类。因此,java.lang.Object 类是所有类的父类,要么是其直接父类,要么是其间接父类。

因此所有的 Java 对象都可调用 java.lang.Object 类所定义的实例方法。

使用继承的注意点:

  1. 子类一般比父类包含更多的属性和方法。
  2. 父类中的 private 成员在子类中是不可见的,因此在子类中不能直接使用它们。
  3. 父类和其子类间必须存在“是一个”即“is-a”的关系,否则不能用继承。但也并不是所有符合“is-a”关系的都应该用继承。例如,正方形是一个矩形,但不能让正方形类来继承矩形类,因为正方形不能从矩形扩展得到任何东西。正确的继承关系是正方形类继承图形类。
  4. Java 只允许单一继承(即一个子类只能有一个直接父类),C++ 可以多重继承(即一个子类有多个直接父类)。

继承的优缺点:

在面向对象语言中,继承是必不可少的、非常优秀的语言机制,它有如下优点:

  1. 实现代码共享,减少创建类的工作量,使子类可以拥有父类的方法和属性。
  2. 提高代码维护性和可重用性。
  3. 提高代码的可扩展性,更好的实现父类的方法。

自然界的所有事物都是优点和缺点并存的,继承的缺点如下:

  1. 继承是侵入性的。只要继承,就必须拥有父类的属性和方法。
  2. 降低代码灵活性。子类拥有父类的属性和方法后多了些约束。
  3. 增强代码耦合性(开发项目的原则为高内聚低耦合)。当父类的常量、变量和方法被修改时,需要考虑子类的修改,有可能会导致大段的代码需要重构。

Java入门基础视频教程,java零基础自学就选黑马程序员Java入门教程(含Java项目和Java真题)

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

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

相关文章

物联网和大数据可应用在哪些领域?

物联网和大数据可应用在哪些领域?物联网和大数据是近年来最受媒体和企业关注的两大宏观技术趋势。两者也并驾齐驱,物联网旨在特定组织或环境中创建一个互联网络,使用该网络来收集数据并集中执行特定功能。物联网部署会生成大量以前未开发的数…

【MR】C++ bullet客户端基于MR的动力学仿真

程序基于(A minimal example showing how to use PyBullet from C over shared memory.一个展示如何在共享内存上从c使用PyBullet的最小示例。https://github.com/erwincoumans/pybullet_cpp_sharedmemory_example)实现与pybullet服务器通信交互。加上MR…

MySql按条件插入数据,MySQL插入语句写where条件,MySQL在插入时做幂等

文章目录写在前面根据条件插入数据1、先准备测试数据2、正常的插入语句3、有条件的插入语句(重点)4、查看最终结果总结分析写在前面 使用MySQL的删、改、查功能时,我们都可以根据where条件来对指定数据进行操作。 插入语句如何通过where条件…

Git —— 关于创建多对非对称公钥时对不同服务器的匹配问题

Git —— 关于创建多对非对称密钥时对不同服务器的匹配问题 《工欲善其事,必先利其器》—— 既然点进来了,麻烦你看下去,希望你有不一样的收获~ 《 前言 》 大概是半年前,我写过一篇关于 git 连接托管平台提示 permission denied…

经典算法冒泡排序之标志位优化版

前言 今天总结一下优化版的经典算法——冒泡排序,不同于以往的暴力二重for循环,这里的冒泡排序增加了一个标志位。我们要理解该冒泡排序的概念,算法流程与算法思想,探讨时间复杂度。 冒泡排序算法解析 一、理解冒泡排序思想 1…

Selenium4+Python3系列(十一) - Page Factory设计模式

写在前面: Page Object模式,目的是将元素定位和元素操作分层,只接触测试内容,不写基础内容,便于后续对自动化测试用例体系的维护,这是中心思想,也是核心。 那么我们继续将简洁延续&#xff0c…

Allegro如何铺网格铜详细操作指导

Allegro如何铺网格铜的三种方法操作指导 在做PCB设计的时候,时常需要铺网格铜,尤其是对于绕性有要求的时候,Allegro可以快捷铺出网格铜,类似下图 具体操作如下 直接铺网格铜 选择Shape add Rect命令 Option Type选择Static Crosshatch 画出需要的图形 鼠标右击done,…

详解go语言包管理方式(go mod), 分析多目录多文件下的管理,不同工程下包的相互调用

先明白一个点, 想要成功运行一个go程序, 有两种模式 一: 以前的默认模式,必须将项目放在gopath/src下 二:使用go mod 包管理方式, 项目可以放到任意位置,这样目录下需要有go.mod文件 下边我会分…

毕业设计 stm32单片机的目标检测与跟踪系统 -物联网 openmv 嵌入式

文章目录0 前言课题简介设计框架3 硬件设计4 软件设计对被测物体的识别判断被测物体所在区域5 最后0 前言 🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年…

力扣(LeetCode)1812. 判断国际象棋棋盘中一个格子的颜色(C++)

数学 如果我们把国际象棋的横轴看做从 111 到 888 ,那么每个棋子的坐标形如 a1(1,1)a1(1,1)a1(1,1) c4(3,4)c4(3,4)c4(3,4) ,想想坐标之和有没有什么规律。 规律 : 黑子坐标之和为偶数,白子坐标之和为奇数。 横轴坐标是我们自定义的&#x…

基于蚁群算法的三维路径规划算法以及蚁群算法的优化计算——TSP优化(Matlab代码实现)

目录 1 概述 1.1简介 1.2 改进的蚁群算法 2 部分运行结果 2.1 三维路径规划算法 2.2 TSP优化算法 3 Matlab代码实现 4 参考文献 1 概述 1.1简介 当前社会, 很多用户需要在复杂的没有公路的山地地形, 快速、准确的规划出三维路径, 在避过障碍的同时达到某项指标最优。…

【C++笔试强训】第四天

文章目录选择题编程题选择题 #include<iostream> #include<cstdio> using namespace std; int main(){int m0123, n123;printf("%o %o\n", m, n);return 0; }程序运行后的输出结果是&#xff08;&#xff09; A 0123 0173 B 0123 173 C 123 173 D 173 1…

RabbitMQ基本使用

先会用&#xff0c;知道mq是干嘛的&#xff0c;怎么用RabbitMQ 再去考虑一系列深入东西 一&#xff1a;什么是MQ MQ消息队列详解、四大MQ的优缺点分析_从百草园杀到三味书屋&的博客-CSDN博客 理解什么是MQ MQ在企业/程序中的作用是什么&#xff1f; MQ&#xff0c;中文是…

Fluent的porous jump边界条件

1 porous jump简介 多孔介质指内部具有连通的空洞&#xff0c;可使流体穿过的固体。多孔介质具有以下特点&#xff1a; 流道极复杂&#xff0c;活性炭过滤器等随机排布的多孔介质甚至不存在可通过曲面和实体表征的确定流道多孔介质只是流场的一部分&#xff0c;通常不关注多孔…

DataSphere Studio数据应用开发管理集成框架【DSS基础】

https://github.com/WeBankFinTech/DataSphereStudio/https://gitee.com/WeBank/DataSphereStudio 基于插拔式的集成框架设计&#xff0c;及计算中间件 Linkis &#xff0c;可轻松接入上层各种数据应用系统&#xff0c;让数据开发变得简洁又易用。在统一的 UI 下&#xff0c;Da…

[附源码]Python计算机毕业设计Django中小学课后延时服务管理系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

前端_Vue_2.创建一个Vue应用、模板语法

文章目录一、创建一个Vue应用1.1. 应用实例1.2. 根组件1.3. 挂载应用1.3.1. DOM中的根组件模板1.4. 应用配置1.5. 多个应用实例二、模板语法2.1. 文本插值2.2. 原始HTML2.3. Attribute绑定2.3.1. 简写2.3.2. 布尔型 Attribute2.3.3. 动态绑定多个值2.4. 使用JavaScript表达式2.…

记录一次Sql性能优化

场景&#xff1a; 主业务表 contract&#xff08;合同表&#xff09;&#xff0c;对于不同主体&#xff08;人员&#xff09;&#xff0c;能查看的合同是不一样的。系统企业业务用到了&#xff0c;系统资源表 PERMISSION_RESOURCE 、员工对于资源关系表&#xff1a;ENTRY_JOIN…

物联卡批发为什么那么火爆?

2022年物联网行业开始爆发&#xff0c;针对于企业设备联网的物联卡就显得格外重要了&#xff0c;而共享单车&#xff0c;移动支付&#xff0c;智慧城市&#xff0c;自动售卖机等企业采购物联卡会面临着各种问题&#xff0c;低价陷阱&#xff0c;流量虚假&#xff0c;管理混乱&a…

[Python图像处理] 合成微缩效果

合成微缩效果前言图像微缩效果原理实现图像微缩效果相关链接前言 图像中的模糊效果可以强烈影响被拍摄场景的感知&#xff0c;模糊在传达所需的尺寸和距离感方面起着重要作用。合成微缩 (miniature faking) 是一个使真实大小物体照片看起来像微缩模型照片的过程&#xff0c;也…