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

大佬给推荐的韩顺平老师的课程 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动手写一下~

  • 小学生
    1.4 面向对象编程中级 对象的继承与super关键字-跟着韩老师学JavaSE_第1张图片
  • 大学生
    1.4 面向对象编程中级 对象的继承与super关键字-跟着韩老师学JavaSE_第2张图片
    1.4 面向对象编程中级 对象的继承与super关键字-跟着韩老师学JavaSE_第3张图片
    这里代码复用性比较严重

(可以看到下面两块儿的重复程度是相当滴高啊!1.4 面向对象编程中级 对象的继承与super关键字-跟着韩老师学JavaSE_第4张图片
1.4 面向对象编程中级 对象的继承与super关键字-跟着韩老师学JavaSE_第5张图片
所以我们后面要使用继承来解决代码复用的问题~

不管怎样 先测试下能不能实现我们的案例
1.4 面向对象编程中级 对象的继承与super关键字-跟着韩老师学JavaSE_第6张图片输出一下~
1.4 面向对象编程中级 对象的继承与super关键字-跟着韩老师学JavaSE_第7张图片
可以看到抛开代码复用性的问题 结果是符合预期的

【2】什么是继承?

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

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

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

继承的基本语法:

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

【3】继承原理图

一句话概括

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

1.4 面向对象编程中级 对象的继承与super关键字-跟着韩老师学JavaSE_第8张图片

【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();
    }
}

测试一下——
1.4 面向对象编程中级 对象的继承与super关键字-跟着韩老师学JavaSE_第9张图片
符合预期!

【5】继承使用细节

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

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

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

但是私有属性和方法不能在子类直接访问 要通过公共的方法去访问
1.4 面向对象编程中级 对象的继承与super关键字-跟着韩老师学JavaSE_第10张图片
1.4 面向对象编程中级 对象的继承与super关键字-跟着韩老师学JavaSE_第11张图片
那么我们想要用这个private的属性和方法 咋搞呢?
请添加图片描述
1.4 面向对象编程中级 对象的继承与super关键字-跟着韩老师学JavaSE_第12张图片
如上 写一个公有的方法就好啦!

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

从而完成父类的初始化
1.4 面向对象编程中级 对象的继承与super关键字-跟着韩老师学JavaSE_第13张图片
这个 super() 是默认放在这个位置的(编译器做这个工作 不用写其实也可以~)

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

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

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

1.4 面向对象编程中级 对象的继承与super关键字-跟着韩老师学JavaSE_第14张图片
子类这边 默认调用父类的无参构造器
1.4 面向对象编程中级 对象的继承与super关键字-跟着韩老师学JavaSE_第15张图片
创建两个子类对象 试试看1.4 面向对象编程中级 对象的继承与super关键字-跟着韩老师学JavaSE_第16张图片
说实话这里蛮难理解的
可以去看看韩老师的视频 增强理解

【2】如果父类没有提供无参构造器 则必须在子类的构造器中用super去指定“使用父类的哪个构造器”完成对父类的初始化工作 否则 编译不会通过的哦
1.4 面向对象编程中级 对象的继承与super关键字-跟着韩老师学JavaSE_第17张图片
子类如果和之前一样 就会报错嗷
1.4 面向对象编程中级 对象的继承与super关键字-跟着韩老师学JavaSE_第18张图片
测试一下 发现与之前不同的地方在于 父类构造器的调用不再是无参的 而是有参的
1.4 面向对象编程中级 对象的继承与super关键字-跟着韩老师学JavaSE_第19张图片

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

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

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

都是可以使用 super 实现滴!
1.4 面向对象编程中级 对象的继承与super关键字-跟着韩老师学JavaSE_第20张图片

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

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

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

所以这两个方法不可以共存于一个构造器!
1.4 面向对象编程中级 对象的继承与super关键字-跟着韩老师学JavaSE_第21张图片

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

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

请添加图片描述

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

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

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

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

之后研究源码的时候还会说到这里~
1.4 面向对象编程中级 对象的继承与super关键字-跟着韩老师学JavaSE_第22张图片

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

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

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

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

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

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

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

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

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

主要看一下 “子类继承父类 创建子类对象时 内存中到底发生了什么?”
1.4 面向对象编程中级 对象的继承与super关键字-跟着韩老师学JavaSE_第23张图片
我们理解知识点的时候 要多从底层来思考!

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

子类创建的内存布局

研究下这段代码
1.4 面向对象编程中级 对象的继承与super关键字-跟着韩老师学JavaSE_第24张图片
【1】首先分析下方法区——
1.4 面向对象编程中级 对象的继承与super关键字-跟着韩老师学JavaSE_第25张图片
【2】然后看看堆区

在分配grandpa的属性的时候 堆区会给name hobby分配地址1.4 面向对象编程中级 对象的继承与super关键字-跟着韩老师学JavaSE_第26张图片
(其他的类同理)
这些属性会分配到常量池——
1.4 面向对象编程中级 对象的继承与super关键字-跟着韩老师学JavaSE_第27张图片
之后堆中的son对象会把地址返回给主方法的对象引用
1.4 面向对象编程中级 对象的继承与super关键字-跟着韩老师学JavaSE_第28张图片

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

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

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

我们原则是:先找子类的对应属性 子类没有就去找父类 以此类推
1.4 面向对象编程中级 对象的继承与super关键字-跟着韩老师学JavaSE_第29张图片

【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】继承学习结束后 类的定义进一步完善了!

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

类的定义得到了进一步的完善!
1.4 面向对象编程中级 对象的继承与super关键字-跟着韩老师学JavaSE_第30张图片

当然了 之后还是有很重要的内容——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的比较

1.4 面向对象编程中级 对象的继承与super关键字-跟着韩老师学JavaSE_第31张图片
这里前面其实已经说得很清楚了哈

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

this就是访问本类中的成员

你可能感兴趣的:(#,跟着韩老师扎实学Java,Java开发学习之路,java,类,面向对象编程)