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

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

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

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

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

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

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

文章目录

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就是访问本类中的成员

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值