代码编织梦想

在这里插入图片描述

  • 作者:努力学习的大一在校计算机专业学生,热爱学习和创作。目前在学习和分享:算法、数据结构、Java等相关知识。
  • 博主主页: @是瑶瑶子啦
  • 所属专栏: Java岛冒险记【从小白到大佬之路】;该专栏专注于Java相关知识,持续更新,每一篇内容优质,浅显易懂,不失深度!
  • 近期目标:写好专栏的每一篇文章

在这里插入图片描述

前言

在前面的文章中,对什么是类,什么是对象已经有清晰的理解了(【JavaSE】保姆级教程|1万字+10张图入门到学会类与对象(建议收藏))。我们脑海里目前有一下几个印象:

  • 类是由现实生活的事物抽象而来
  • 类更多是表示一种自定义类型(记住&体会这点,在后面讲到接口的时候还会提到这句话)
  • 类之间有一定的关系
    • 相对独立
    • 依赖(uses-a)

但是现实生活中,事物之间(类型之间)的关系并不是这么单纯。比如:动物、小狗、小猫、兔兔…动物类和其他这些类之间存在关系是–(is-a)

在这里插入图片描述
Java中将这种类与类之间的包含/分类关系描述为继承–is-a
这篇文章带大家入门Java第二大重要特性

📍Part1:继承的介绍&语法

Java中是以什么样的语法来表示类与类之间这种继承关系呢?

首先要明白两个概念:

  • 父类/基类
  • 子类/派生类

父类和子类的关系是:子类 is-a 父类.即子类是包含于父类的。

下面就以“前言”中提到的动物例子举例:

【重点】子类在类声明(即类名后面)加上extends 父类类名,表示继承关系

"extends"的英文意思是“扩展”,就是指,子类继承了父类(继承父类非private属性&方法),自己也可以定义属性&方法&重写方法。本质上子类的确可以看作是父类的一种扩展

  • 父类:class Animal
public class Animal {
    private int age;
    private String name;

    public void eat() {
        System.out.println("吃东西ing");
    }

    //下面是两个属性的构造器
    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

  • 子类1:汪星人:class Dog
public class Dog extends Animal {
    @Override
    public void eat() {
        System.out.println("啃骨头ing");
    }
}
  • 子类2:喵星人:class Cat
public class Cat extends Animal {
    @Override
    public void eat() {
        System.out.println("吃小鱼儿ing");
    }
    public void climb(){
    	System.out.println("猫咪爬树");
}

【注意】

  • Java是单继承机制,即:每个类有且仅有一个父类。(C++是多继承)
  • 继承可以是多层的,即:在没有final限制的情况下,子类可以向下派生子类:
Inheritance
Inheritance
Inheritance
classA
classB
classC
classD

📍Part2:继承的特性

通过上面,可能还是有点懵。难道说继承的存在,仅仅是表示类之间的关系?不。

我们来深入学习一些,子类继承了父类,给我们带来了什么,以及我们怎么样去使用继承。

继承时父类和子类产生关联,带来主要以下特性:

  • 子类继承父类非private属性、方法(non-staticstatic均继承过来了)

  • 子类可以重写从父类继承过来的实例方法(静态属性、静态方法和非静态的属性都可以被继承和隐藏而不能够被重写!)

  • 父类引用可以指向子类对象【多态】

也正是这几点,也带来了继承的好处:

  • 代码复用性提高
    把公共的属性、方法定义在父类中,子类由于继承(只能继承非private修饰)了父类的属性、方法,无需重复声明&定义,提高代码复用性。子类只需要关心自己的特有属性和方法(单独声明定义of重写父类方法

  • 更易于管理不同的对象
    是基于多态&动态绑定的,(我们下文中细讲)

Inheritance
Inheritance
Animal
-int age
-String name
+getAge() : int
+setAge() : void
+getName() : String
+setName() : void
Dog
Cat
+climb() : void

当然,经过上文,我们对继承有了一个大概的初印象。但是继承的使用和一些细节还有很多学问。咱们接下来打起精神。逐个攻破!

📍Part3:继承细节

📌3.1:super关键字

【Java】还不懂this关键字?一分钟彻底弄懂this关键字我们对this关键字有了一个很透彻的认识:this关键字是对象的隐藏属性,代表此对象的引用,通过this.属性this.方法我们指定可以调用本类的属性和方法。

与this关键字作用很相似的一个关键字是super:指向当前对象的父类。
和this用法类似,只不过super是**在本类中访问父类的属性/方法/构造器:super.父类属性/super.父类方法/super()(不可调用父类中被private修饰的属性or方法!)

【super作用】

  • 在子类构造器中使用super()来调用父类构造器,来完成对父类属性的初始化。
  • 区分子类中定义的和父类中同名的属性/方法

【对比】

区别点thissuper
本质this的本质是一个实实在在存在的参数,在对象调用实例方法时,会被作为隐藏参数传入实例方法中。super的本质仅仅就是关键字,编译后会被翻译成一条指令:invokespecial ,用于调用一些需要特殊处理的实例方法,包括实例初始化方法、私有方法和父类方法。
this/super.属性(访问属性)访问本类的属性。若本类没有,逐级向上查找访问其直接父类的属性,若没有,逐级向上查找
this/super.方法同访问属性的查找规则规则同访问属性的查找规则

📌3.2:子类构造器

关于构造器,推荐大家先去阅读这篇文章:【Java】一文看懂构造器/构造方法(Cunstructor)。文章很短,方便你更好的理解下面知识。

在之前讲构造器的时候,没有讲到继承。
其实构造器中行首隐含了一条默认语句:super(): 调用父类构造器,完成对父类属性初始化

public class Dog extends Animal {
    @Override
    public void eat() {
        System.out.println("啃骨头ing");
    }

    public Dog() {
        //super();
    }
}

【注意】

  • 若父类无参构造器不存在,必须显示调用父类存在的构造器
  • super调用父类构造器和this调用本类构造器,有且只能有一条,且必须位于行首(即使用this()来调用本类构造器,最终肯定调用到某个构造器中还会调用super()的,这个不用担心父类没有被初始化)

📌3.3:protected关键字

关于访问修饰符在【Java】一文彻底弄懂访问修饰符(public/protected/默认/private)–建议收藏已经全面介绍过。这里单独谈谈protected关键字在继承中的作用。

上文已经提到过,子类是无法继承父类被private修饰的属性,但是我们在封装那一篇文章中讲到,由于种种原因,类中的属性最好为private。那怎么办呢?

有一个两全其美的办法—protected关键字:只有子类&同包中其他类可以访问。

📌3.4:final关键字

时刻牢记:我们写的类是现实中的抽象

真正进入公司,项目中的业务往往比我们举例要复杂很多。意味着,我们写的类会很多,同时类与类之间的关系也会很复杂。

所以,我们并不希望类与类之间继承的层次过深,一般不希望超过三层的继承关系。否则,将对代码进行重构

那如何进行这样的一种限制呢?

可以使用关键字final对类进行修饰:让类不可被继承(若被继承,将在编译时期报错)

举例:我们平时经常使用的String类,就是被final修饰的:

在这里插入图片描述


在这里插入图片描述

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Yaoyao2024/article/details/129677780

【java】java继承的理解和应用_microanswer的博客-爱代码爱编程

重要声明:本文章仅仅代表了作者个人对此观点的理解和表述。读者请查阅时持自己的意见进行讨论。 本文更新不及时,请至原文地址查看:【Java】java继承的理解和应用。 继承这一特性在Java中的应用十分广泛,几乎

深入理解Java中的不可变对象-爱代码爱编程

二哥,你能给我说说为什么 String 是 immutable 类(不可变对象)吗?我想研究它,想知道为什么它就不可变了,这种强烈的愿望就像想研究浩瀚的星空一样。但无奈自身功力有限,始终觉得雾里看花终隔一层。二哥你的文章总是充满趣味性,我想一定能够说明白,我也一定能够看明白,能在接下来写一写吗? 收到读者小 R 的私信后,我就总感觉自己有一种义

五分钟学Java:一篇文章带你搞懂spring全家桶套餐-爱代码爱编程

原创声明 本文作者:黄小斜 转载请务必在文章开头注明出处和作者。 本文思维导图 spring全家桶里都有哪些食物 上期我们讲了spring和springmvc两个框架的基础知识和学习路线,而这期内容,我们将围绕着spring全家桶展开来讨论。 大家应该都知道,按照出现的顺序,spring全家桶大概包含了spring、springmvc、sp

硬核干货合集!500+篇Java干货技术文章整理|资源|书单|工具|面试指南|强烈建议打开!-爱代码爱编程

  今天给大家推荐一位在阿里做Java的朋友给大家,他是公众号【程序员书单】的作者黄小斜。   他的公众号【程序员书单】这两年来累积了200多篇优质原创文章,独家原创的系列文章有《五分钟学编程》系列,以及最近在大量创作的《程序员书单》系列文章,黄小斜在公众号里也写了很多使用的技术干货,他将其中的精华内容都整理到了这篇文章里。   该公众号专注

Java从入门到干活必须要懂的String类,看这一篇足矣-爱代码爱编程

欢迎关注微信公众号:Coding我不配 获取更多干货,一起每天进步一点点 1 初识 String 类 小伙伴们几乎都是从第一个 HelloWorld 程序: package com.coding.wbp public class HelloWorld { // Java 入口程序,程序从此开始执行 public static voi

Docker学习|Java后端必备技能|入门一篇就够了-爱代码爱编程

Docker学习 平常的产品发布的时候,我们根据不同平台需要配置不同的环境,大大增加了我们的工作。而Docker就可以简化我们的工作,Docker镜像的设计,使得Docker得以打破过去**「程序即应用」**的观念。透过镜像(images)将作业系统核心除外,运作应用程式所需要的系统环境,由下而上打包,达到应用程式跨平台间的无缝接轨运作。 可以想

【Java进阶最详解】Map入门一篇看懂(一)继承关系和区别了解-爱代码爱编程

文章目录 Map简介:Entry接口(映射项)Map常用所有方法专用Map实现类AbstractMap通用Map实现类HashTable(弃用)HashMapLinkedHashMapTreeMap其余通用Map Map简介: 引言:Map是Java三种集合中的一种位于java.util包中,Map作为一个接口存在定义了这种数据结构

【Java进阶最详解】List入门一篇看懂(一)继承关系和区别了解-爱代码爱编程

文章目录 List简介实现类ArrayListLinkedListVector总结 List简介 引言: Java中List是一个有序的、可重复的集合,扩展Collection接口的接口,在java.util包下,提供增删改查数据的基本功能,且可以通过索引来插入替换和删除集合元素的方法。集合的出现就是为了持有对象,集合中可以存储任意类型

一篇文章带你搞懂Python中的继承和多态-爱代码爱编程

点击上方“Python爬虫与数据挖掘”,进行关注 回复“书籍”即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 岩溜喷空晴似雨,林萝碍日夏多寒。 一、继承的介绍 继承是一种创建新的类的方式,新创建的叫子类,继承的叫父类、超类、基类。继承的特点就是子类可以使用父类的属性(特征、技能)。继承是类与类之间的关系。 继承可以减

一篇文章让你从入门到彻底学会Java-爱代码爱编程

** 一篇文章让你从入门到彻底学会Java 文章目录 一篇文章让你从入门到彻底学会Java第一个Java程序+基础知识详解Java的对象和类Java中的数据类型Java变量类型Java运算符Java中的循环Java 条件语句Java中的switch case语句Java 中的 Math 类Java Character 类Java String类

【Java基础】之AWT,一篇文章搞懂awt(包含绘图)-爱代码爱编程

🌈博客主页:强子的博客 📅 发文时间:2022.3.15 🎈 一定存在只有你才能做成的事 🌹 博主水平有限,如有错误,欢迎指正 欢迎给位👍收藏💎评论✉ Java awt 👑👑 AWT📜📜Java AWT简介 (Introduction to Java AWT)🏮🏮层次结构 (Hierarchy)💐💐2.4 LayoutManage布局管

如果看了这篇文章你还不懂gradle,那你还是把我删了吧-爱代码爱编程

文章目录 what is gradle?小试牛刀-android中的gradlegroovy-学gradle的密钥Project与Task-gradle构建体系总结 Hi,大家好啊~ 我已经很久都没有更新自己的学习笔记了,感谢大家这么久以来还把我留在列表里。这么久以来不更新的原因主要是长期在支持业务需求,导致对基础知识的沉淀大大忽视了。这样是不

java程序入门教程 | java_摇摆的小土豆z的博客-爱代码爱编程

        有一个朋友这样告诉我:Java太难了!上课老师不讲代码,我怎么学?!         我也发现了,以我们学校为例吧。很多Java教学者似乎不太愿意细嗦代码怎么写。(在大一已经学习过C语言的基础上,Java其实真的很简单!!)他们热衷于告诉你“Java是面向对象的编程语言”或者告诉你一些关于对象、包、方法、继承等等概念,然而他们达到了某种共

java基础算法看这一篇就够了,简单全面一发入魂_java算法-爱代码爱编程

目录 1、简单的概述一下你眼中的算法?2、什么是Java的字节码?3、如何才能将一个double变量初始化为无穷大?4、能够将double类型的值和int类型的值相互比较吗?5、如果使用一个变量前没有将它初始化