• Java 继承与实现


    一、继承(extends)

    1.1 继承概念

    继承是面向对象的基本特征,它允许子类继承父类的特征和行为,以提高代码的复用率和维护性等。下面一张图生动地展示了继承和类之间的关系:

    继承图

    上图中,“动物”、“食草动物”、“食肉动物”以及各种具体的动物类型,都相当于 Java 中的类,而它们之间的“父子”关系就是继承,每一种具体动物类型的实际个体就是对象,或者说是类的实例。

    Java 中继承通过 extends 关键字来声明:

    1. class Father {}
    2. class Son extends Father {}

    1.2 继承模式

    一般来说,面向对象编程语言应该有四种继承模式,但 Java 中只有三种继承模式:单继承、多重继承和多态。某些面向对象语言还具有多继承的继承模式,如 Python。下面一张图生动地展示了四种继承模式的区别。

    继承模式(图片来源于菜鸟教程 www.runoob.com)

    上图中“不同类继承同一个类”指的就是多态。

    1.3 this 关键字

    this 关键字从字面意思上面看,是这个的意思,在类中就代表这个类的实例对象本身(并非类本身),这是为了方便调用对象的一些属性和方法而设定。关于 this 这个名称的由来,实际 this 是从 C++ 借鉴而来的,C++ 面向对象中的 this 关键字和 Java 中的 this 关键字有近乎相同的含义。其他的面向对象编程语言也有类似的,但并不是都作为关键字,如 Python 中,拥有类似功能的是一个约定名称为 self 的特殊参数。

    我们可以通过 this 关键字来访问该类本身:

    1. class Son {
    2. Integer age = 6;
    3. void printAge (){
    4. System.out.println(this.age); // Output: 6
    5. }
    6. }

    1.4 super 关键字

    既然有 this 代表本身,就有代表其父类的关键字,那便是 super 了。super 关键字和 this 在范围定义上略有不同,this 代表实例,而 super 代表的是类,且是该类的父类,但并不是指它的某一个具体父类,而是其所有父类的一种合体。

    比如说,GrandSon -> Son -> Father,那么对于 GrandSon 而言,this 就表示 GrandSon 的实例对象,而 super 代表 Son 和 Father 的一种合体。你可以认为 super 是一个同时包含 Son 和 Father 的属性及方法的特殊类。

    关于 super 关键字名称的由来,实际上,父类更加标准的说法是超类,但是“父子”关系更容易说明继承的关系,所以我们一般会将超类称为父类,但实际上,super 正是超级的含义,意为一种超级的类,即子类的所有父类集合体。其他的编程语言中,也几乎都是用 super 来表示的。

    我们可以通过 super 关键字来访问父类:

    1. class Father {
    2. Integer age = 66;
    3. }
    4. class Son extends Father {
    5. Integer age = 6;
    6. void printAge (){
    7. System.out.println(this.age); // Output: 6
    8. System.out.println(super.age); // Output: 66
    9. }
    10. }

    1.5 final 关键字

    final 关键字已在其他文章详述,此处不再赘述,详情请见:Java 中的关键字 final 和 static-CSDN博客

    1.6 多态

    多态是同一个行为具有多个不同表现形式或形态的能力,说简单点,就是“多种形态”。当一个方法有多种不同的实现方式时,或者一个抽象类/接口,有多种不同的实现类时,即为多态。举个贴近日常生活的例子,一支笔(抽象类型),我们不指定它的具体类型,可以用来书写(抽象方法),我们不指定它的具体书写效果,则有很多东西都是属于这支笔的分类,比如不同颜色的黑笔、红笔、蓝笔等实现了不同颜色的效果,是多种形态,那么这就属于多态。前面说的属于从方法角度来讨论的,也可以从类型的角度来考虑,比如毛笔、铅笔、钢笔等,都是笔,但它们并不完全相同。

    使用多态有很多好处:

    • 消除类型之间的耦合关系;
    • 可替换性;
    • 可扩充性;
    • 灵活性;

    一个面向对象程序要拥有良好的结构,那么多态几乎是必不可少的。那么,Java 中的多态是怎么实现的呢?

    Java 中实现多态的方式一般有三种:

    • 重写:通过重写子类中的方法来实现同一方法名,不同功能的效果,实现多态;
    • 接口:一个接口,多种不同的实现,即为多态;
    • 抽象类和抽象方法:和接口类似,一个抽象类或者抽象方法,多个不同的子类继承后就有多种不同的实现,也能实现多态;

    二、实现(implements)

    实现不同于继承,继承是相对于类而言的,实现却是相对于接口而言的,实现的方式比继承多一种,即实现可以“多实现”。所有的面向对象语言都有继承的概念,但并非所有的面向对象语言都有实现的概念,因为只有部分语言拥有真正意义上的接口,如 Java 和 C#。

    实现通过 inplements 关键字来声明:

    1. interface Father1 {}
    2. interface Father2 {}
    3. class Son implements Father1, Father2 {}

    接口可以被类实现,但接口本身却不可以被接口实现。也就是说,类既可以继承类,也可以实现接口,但接口只能继承接口,具体情形如下图:

    类和接口、继承和实现

    上图中,多条线的地方表示可以”多继承“,但并非真正的多继承。具体可见下面的示例:

    1. interface interface1 {}
    2. interface interface2 {}
    3. interface interface3 extends interface1, interface2 {} // 多“继承”
    4. class class1 {}
    5. class class2 extends class1 {} // 继承
    6. class class3 implements interface1, interface2 {} // 多实现
  • 相关阅读:
    vue和react的区别
    挑战10个最难的Java面试题(附答案)【上】
    java毕业设计基于BS架构的疫情包联信息管理系统的设计与实现mybatis+源码+调试部署+系统+数据库+lw
    wangeditor 编辑器图片上传遇到的问题: u.upload.addEventListener is not a function
    【Django】Django路由urls详解
    冬季如何养胃?羊大师建议水果蔬菜不可少!
    [WPF]浅析依赖属性(DependencyProperty)
    中国油烟机行业深度发展研究与“十四五”企业投资战略规划报告
    数据排序(多字段数据排序)
    52.MongoDB复制(副本)集实战及其原理分析
  • 原文地址:https://blog.csdn.net/weixin_62651706/article/details/133841438