大佬给推荐的韩顺平老师的课程 2021年刚刚录的船新版本!
【零基础 快速学Java】韩顺平 零基础30天学会Java
硬把从另一个讲师那里看了300多集的我拽过来 几十节课一下子爱上这个节奏了!安利!!

具有其他语言基础的盆友只需要把前几章的章节总结简单看一下 然后再去着重看需要学习的章节就可以了!
知识点分的非常清晰! 每章还有总结 这…真的是我理想中的学习资料呐!

学习笔记整理过后放到这里

  • 一方面是让自己再二次记忆一下
  • 一方面是希望可以帮到有这方面知识需要的朋友 给他们一个新的切入点来重新了解这一个知识

本专题包括以下几个主要知识点~


本次笔记主要记录 继承 、 super关键字的内容
继承的难度比上一章的封装 要上一个台阶 但是不要慌 因为后面的多态更难QAQ
咳咳不对 因为跟着韩老师的课程学一遍 跟着这份笔记看一遍 就能看明白咯!

文章目录

  • 4.继承
    • 【1】为什么需要继承?
    • 【2】什么是继承?
    • 【3】继承原理图
    • 【4】快速入门继承
    • 【5】继承使用细节
      • 1.父类的私有属性子类咋用呐
      • 2.子类必须调用父类的构造器
      • 3.父类中构造器为无参和有参的区别
      • 4.如果希望指定去调用父类的某个构造器 则显式地调用一下(super 参数列表)
      • 5.super在使用时 必须放在构造器的第一行(super只能在构造器中使用)
      • 6.super()和this()都只能放在构造器的第一行
      • 7.Java所有类都是Object类的子类 Object是所有类的基类
      • 8.父类构造器的调用不限于直接父类!将一直往上追溯到Object类
      • 9.子类最多只能继承一个父类(直接继承)即Java是单继承机制
      • 10.我们不能滥用继承 子类和父类之间必须满足is-a的逻辑关系
    • 【6 重点!】继承本质详解
      • 子类创建的内存布局
      • 实例对子类与父类同名属性访问的原则
    • 【7】继承课堂练习
      • 案例一
      • 案例二
      • 案例三
    • 【8】继承学习结束后 类的定义进一步完善了!
  • 5.super关键字
    • 【1】super的基本语法
      • 1.访问父类的属性 但不能访问父类的private属性
      • 2.访问父类的方法 不能访问父类的private方法
      • 3.访问父类的构造器 只能放在构造器的第一句!
    • 【2】super关键字注意细节
      • 1.调用父类的构造器的好处——
      • 2.子类和父类的成员(属性/方法)重名时 为了访问父类的成员 必须通过super;如果没有重名 使用super this 直接访问效果一样~
      • 3.super的访问不限于直接父类 另外如果多个基类都有同名成员 使用super访问遵循就近原则 A->B->C
    • 【3】super与this的比较

4.继承

【1】为什么需要继承?

来通过一个实例引入

这也是比较老生常谈的继承引出方式啦(两个有很多共同点的类)

打开IDE动手写一下~

  • 小学生
  • 大学生


    这里代码复用性比较严重

(可以看到下面两块儿的重复程度是相当滴高啊!

所以我们后面要使用继承来解决代码复用的问题~

不管怎样 先测试下能不能实现我们的案例
输出一下~

可以看到抛开代码复用性的问题 结果是符合预期的

【2】什么是继承?

继承可以解决代码复用 让我们的编程更加接近人类思维!

当多个类存在相同的属性(变量)和方法时,可以从这些类中抽象出父类,在父类中定义这些相同的属性和方法

所有子类不需要重新定义这些属性和方法,只需要通过 extends声明继承父类就能用这些属性和方法了!

继承的基本语法:

class 子类 extends 父类{}
//这样继承过后 子类就会自动拥有父类定义的属性和方法
  • 父类又叫 超类 基类
  • 子类又叫 派生类

【3】继承原理图

一句话概括

子类继承父类的共用属性与方法,
同时子类拥有自己的特有属性与特有方法。

【4】快速入门继承

使用继承改进刚才的学生考试案例

创建一个Student类解决 Graduate Pupil类 代码冗余度过高的问题

//大学生和小学生的父类 Student
public class Student {public String name;public int age;private double score;public void setScore(double score) {//使用set快捷键 直接写好setScore方法this.score = score;}public void showInfo(){System.out.println("name " + name + " age " + age + " score " + score);}
}

接下来两个类就好写得多啦

只需要各自写出他们独特的方法就行

  • Pupil
public class Pupil extends Student{//让Pupil继承Student类public void testing() {System.out.println("小学生" + name + "正在考小学数学");}
}
  • Graduate
public class Graduate extends Student{public void testing(){System.out.println("大学生" + name + "正在考大学数学");}
}

测试一下

(代码和之前是一样的)

public class Extends01 {public static void main(String[] args) {Pupil pupil = new Pupil();pupil.name = "小黄";pupil.age = 2;pupil.testing();pupil.setScore(66);pupil.showInfo();Graduate graduate = new Graduate();graduate.name = "菜粥";graduate.age = 21;graduate.testing();graduate.setScore(99);graduate.showInfo();}
}

测试一下——

符合预期!

【5】继承使用细节

1.父类的私有属性子类咋用呐

https://www.bilibili.com/video/BV1fh411y7R8?p=289

子类继承所有的属性和方法 非私有的属性和方法可以在子类中直接访问

但是私有属性和方法不能在子类直接访问 要通过公共的方法去访问


那么我们想要用这个private的属性和方法 咋搞呢?


如上 写一个公有的方法就好啦!

2.子类必须调用父类的构造器

从而完成父类的初始化

这个 super() 是默认放在这个位置的(编译器做这个工作 不用写其实也可以~)

至于为啥是 super() 之后会再介绍

3.父类中构造器为无参和有参的区别

【1】创建子类对象的时候,不管使用子类的哪个构造器 默认情况下总会去调用父类的无参构造器


子类这边 默认调用父类的无参构造器

创建两个子类对象 试试看
说实话这里蛮难理解的
可以去看看韩老师的视频 增强理解

【2】如果父类没有提供无参构造器 则必须在子类的构造器中用super去指定“使用父类的哪个构造器”完成对父类的初始化工作 否则 编译不会通过的哦

子类如果和之前一样 就会报错嗷

测试一下 发现与之前不同的地方在于 父类构造器的调用不再是无参的 而是有参的

4.如果希望指定去调用父类的某个构造器 则显式地调用一下(super 参数列表)

https://www.bilibili.com/video/BV1fh411y7R8?p=291

这里有三种对父类某个构造器进行调用的方法

都是可以使用 super 实现滴!

5.super在使用时 必须放在构造器的第一行(super只能在构造器中使用)

这一点在下面中体现出来了~

6.super()和this()都只能放在构造器的第一行

所以这两个方法不可以共存于一个构造器!

7.Java所有类都是Object类的子类 Object是所有类的基类

https://www.bilibili.com/video/BV1fh411y7R8?p=292

8.父类构造器的调用不限于直接父类!将一直往上追溯到Object类

也就是说我们进行调用的时候 还可以调用父类的父类 父类的父类的父类……

一直可以追溯到顶级父类Object!

每个父类都会往上去找 一直找到Object

之后研究源码的时候还会说到这里~

9.子类最多只能继承一个父类(直接继承)即Java是单继承机制

Java是单继承机制的 所以一个类只能继承一个父类
但是Java只能“单继承”么?
后面的“接口”中我们会继续探究

其实接口是可以多继承的哦!

10.我们不能滥用继承 子类和父类之间必须满足is-a的逻辑关系

这个is-a的逻辑关系可以说是很经典了~

(用于形容子类和父类之间的关系)

【6 重点!】继承本质详解

这里是非常重要的一个点哦!!!

我们通过一个案例来强化对继承本质的了解

主要看一下 “子类继承父类 创建子类对象时 内存中到底发生了什么?”

我们理解知识点的时候 要多从底层来思考!

其中为了理解继承的本质 我们要理解子类创建的内存布局(又是jvm虚拟机的一些内容)——

子类创建的内存布局

研究下这段代码

【1】首先分析下方法区——

【2】然后看看堆区

在分配grandpa的属性的时候 堆区会给name hobby分配地址
(其他的类同理)
这些属性会分配到常量池——

之后堆中的son对象会把地址返回给主方法的对象引用

那当son对不同类的同名属性进行访问的时候 会输出什么呢?
grandpa的name属性 father的name属性肯定不是一个啊~
这个问题引出了实例访问子类、父类同名属性的一个重要原则~

要记住这个原则嗷 我们后面在多态中还会遇到类似的概念

实例对子类与父类同名属性访问的原则

我们原则是:先找子类的对应属性 子类没有就去找父类 以此类推

【7】继承课堂练习

练习在课程二刷的时候进行练习~

案例一

https://www.bilibili.com/video/BV1fh411y7R8?p=295

案例二

https://www.bilibili.com/video/BV1fh411y7R8?p=296

案例三

https://www.bilibili.com/video/BV1fh411y7R8?p=297

【8】继承学习结束后 类的定义进一步完善了!

学习完继承的内容之后 我们对于类的学习又到达了一个新的位置——

类的定义得到了进一步的完善!

当然了 之后还是有很重要的内容——7.多态 要进行学习!继续加油!!

5.super关键字

在面向对象中 super用的是比较多的~

super代表父类的引用 用于访问父类的 属性、方法、构造器

【1】super的基本语法

1.访问父类的属性 但不能访问父类的private属性

这肯定啊 私有属性 听起来就不是很可以访问啦~

super.属性名

2.访问父类的方法 不能访问父类的private方法

super.方法名(参数列表)

3.访问父类的构造器 只能放在构造器的第一句!

这个我们之前在继承的注意事项中刚刚说过嗷~

public A(){}
public A(String name){}
public A(String name, int age){}
//以上为父类public B(){//对父类的构造器进行访问!//别忘了只能写在第一行!!//super();//super("jack");super("jack", 10)
}

【2】super关键字注意细节

https://www.bilibili.com/video/BV1fh411y7R8?p=299&spm_id_from=pageDriver

1.调用父类的构造器的好处——

这个其实也是我初学时比较困惑的一个点~

  • 分工明确
  • 父类属性由父类初始化
  • 子类的属性由子类初始化

2.子类和父类的成员(属性/方法)重名时 为了访问父类的成员 必须通过super;如果没有重名 使用super this 直接访问效果一样~

这里只要记住下面这些内容就OK了!!

拆开来下 就是

  • super.属性——子类、父类成员有重名的情况(使用super可以确保访问到的是父类的 而不是子类的 因为默认是从子类开始访问)
  • super.属性 == 属性 == this.属性 —— 成员没有重名
    • this是从本类开始访问
    • super是从父类开始访问

3.super的访问不限于直接父类 另外如果多个基类都有同名成员 使用super访问遵循就近原则 A->B->C

  • super的访问不限于直接父类 如果爷爷类和本类中有同名的成员 也可以使用super去访问爷爷类的成员!

  • super访问就近原则 先调用谁 就先访问谁哦!

【3】super与this的比较


这里前面其实已经说得很清楚了哈

super就是访问父类中的成员(属性/方法)

this就是访问本类中的成员

1.4 面向对象编程中级 对象的继承与super关键字-跟着韩老师学JavaSE相关推荐

  1. Java学习笔记 六、面向对象编程中级部分

    Java学习笔记 六.面向对象编程中级部分 包 包的注意事项和使用细节 访问修饰符 访问修饰符的注意事项和使用细节 面向对象编程三大特征 封装 封装的实现步骤(三步) 继承 继承的细节问题 继承的本质 ...

  2. (韩顺平)08 面向对象编程(中级部分)(自用)

    目录 08 面向对象编程(中级部分) 8.1 IDE(集成开发环境)-IDEA 8.1.1IDEA 介绍 8.2 IDE(集成开发环境)-Eclipse 8.2.1Eclipse 介绍 8.3 IDE ...

  3. (二)Javascript面向对象编程:构造函数的继承

    Javascript面向对象编程:构造函数的继承 这个系列的第一部分,主要介绍了如何"封装"数据和方法,以及如何从原型对象生成实例. 今天要介绍的是,对象之间的"继承&q ...

  4. Java面向对象编程(中级)

    面向对象编程(中级) 包 访问修饰符 封装 01: public class Encapsulation01 {public static void main(String[] args){Perso ...

  5. C++ Primer 学习笔记_72_面向对象编程 --句柄类与继承[续]

    面向对象编程 --句柄类与继承[续] 三.句柄的使用 使用Sales_item对象能够更easy地编写书店应用程序.代码将不必管理Item_base对象的指针,但仍然能够获得通过Sales_item对 ...

  6. Python - 面向对象编程 - 三大特性之继承

    继承 继承也是面向对象编程三大特性之一 继承是类与类的一种关系 定义一个新的 class 时,可以从某个现有的 class 继承 新的 class 类就叫子类(Subclass) 被继承的类一般称为父 ...

  7. Day55-每日一道Java面试题-Java 面向对象编程三大特性: 封装 继承 多态

    Java 面向对象编程三大特性: 封装 继承 多态 封装 封装把一个对象的属性私有化,同时提供一些可以被外界访问的属性的方法,如果属性不想被外界访问,我们大可不必提供方法给外界访问.但是如果一个类没有 ...

  8. Java基础【之】面向对象编程(封装、继承(extends、方法重写、super)、多态(动态绑定、重载/重写)、代码实现)

    Java基础[之]面向对象编程(封装.继承.多态.代码实现) 1.封装 2.继承 2.1.extends 2.2.方法重写 2.3.super 3.多态 3.1.对象的多态.方法的多态 3.2.动态绑 ...

  9. Day07:常用模块,面向对象编程(对象类)及内置函数

    今日内容: 1.常用模块 2.面向对象编程(*****)     介绍面向对象编程     类     对象 3.内置函数 ------------------------------ 1.面向过程编 ...

最新文章

  1. c语言两个数组按位合并,合并两个线性表(数组)并按照非递减排序输出,有点问题过来看看...
  2. C++类和对象的封装
  3. go与JAVA差异_20190312_浅谈gojava差异(二)
  4. 等待因该出现在while循环中,防止虚假唤醒
  5. 第14章:傅里叶变换
  6. python实现etl_为什么选择R而不是Python做ETL
  7. flume 一对多hdfs_10PB 规模的 HDFS 数据在 eBay 的迁移实战
  8. 首先请与所有现有链接到该网络共享的映射断开连接_疫情之下:该如何使用Python预测员工流失,老板直呼内行!...
  9. 使用Aptana搭建Python开发环境
  10. 置为底层_头一次见浴室装修这样设计,浴缸两头砌上置物台,实用又方便
  11. dhcp网络服务的搭建和配置
  12. Hadoop3.2.0使用详解
  13. 距离的度量(Dissimilarity Measure、Distance Metric)
  14. IOS开发中实现UITableView按照首字母将集合进行检索分组
  15. Java汉字转拼音实现方式
  16. 【基于Pytorch的手写汉字识别】
  17. RNA 提取步骤(trizol)
  18. mSystems:土壤化学计量特性影响土壤C、N和P循环微生物丰度及其对全球变化的抵抗力(一作解读)...
  19. 决策树ID3代码(Python)
  20. 随感 | 毕设风雨 | 前端之路 | 暗夜与旅人 | 早槐与龙鲤

热门文章

  1. 无线上网设备大集合,看看你的设备最适合哪种?
  2. vue核心之虚拟DOM(vdom)与真实DOM页面渲染过程
  3. 【操作系统】虚拟存储器--页面置换算法
  4. 无法加载文件C:\Users\TANG\AppData\Roaming\npm\nrm.ps1,因为在此系统上禁止运行脚本
  5. [附源码]计算机毕业设计JAVA校园征兵及退役复原管理系统
  6. space header page consists of zero bytes in data
  7. Java集合这样子学习
  8. SPI Flash芯片W25Q32英文版数据手册解读(二)---------存储器知识,寄存器
  9. 根键hkey_classes_root的作用
  10. ArcGIS Server 统计服务请求数等