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动手写一下~
- 小学生
- 大学生
这里代码复用性比较严重
(可以看到下面两块儿的重复程度是相当滴高啊!
所以我们后面要使用继承来解决代码复用的问题~
不管怎样 先测试下能不能实现我们的案例
输出一下~
可以看到抛开代码复用性的问题 结果是符合预期的
【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相关推荐
- Java学习笔记 六、面向对象编程中级部分
Java学习笔记 六.面向对象编程中级部分 包 包的注意事项和使用细节 访问修饰符 访问修饰符的注意事项和使用细节 面向对象编程三大特征 封装 封装的实现步骤(三步) 继承 继承的细节问题 继承的本质 ...
- (韩顺平)08 面向对象编程(中级部分)(自用)
目录 08 面向对象编程(中级部分) 8.1 IDE(集成开发环境)-IDEA 8.1.1IDEA 介绍 8.2 IDE(集成开发环境)-Eclipse 8.2.1Eclipse 介绍 8.3 IDE ...
- (二)Javascript面向对象编程:构造函数的继承
Javascript面向对象编程:构造函数的继承 这个系列的第一部分,主要介绍了如何"封装"数据和方法,以及如何从原型对象生成实例. 今天要介绍的是,对象之间的"继承&q ...
- Java面向对象编程(中级)
面向对象编程(中级) 包 访问修饰符 封装 01: public class Encapsulation01 {public static void main(String[] args){Perso ...
- C++ Primer 学习笔记_72_面向对象编程 --句柄类与继承[续]
面向对象编程 --句柄类与继承[续] 三.句柄的使用 使用Sales_item对象能够更easy地编写书店应用程序.代码将不必管理Item_base对象的指针,但仍然能够获得通过Sales_item对 ...
- Python - 面向对象编程 - 三大特性之继承
继承 继承也是面向对象编程三大特性之一 继承是类与类的一种关系 定义一个新的 class 时,可以从某个现有的 class 继承 新的 class 类就叫子类(Subclass) 被继承的类一般称为父 ...
- Day55-每日一道Java面试题-Java 面向对象编程三大特性: 封装 继承 多态
Java 面向对象编程三大特性: 封装 继承 多态 封装 封装把一个对象的属性私有化,同时提供一些可以被外界访问的属性的方法,如果属性不想被外界访问,我们大可不必提供方法给外界访问.但是如果一个类没有 ...
- Java基础【之】面向对象编程(封装、继承(extends、方法重写、super)、多态(动态绑定、重载/重写)、代码实现)
Java基础[之]面向对象编程(封装.继承.多态.代码实现) 1.封装 2.继承 2.1.extends 2.2.方法重写 2.3.super 3.多态 3.1.对象的多态.方法的多态 3.2.动态绑 ...
- Day07:常用模块,面向对象编程(对象类)及内置函数
今日内容: 1.常用模块 2.面向对象编程(*****) 介绍面向对象编程 类 对象 3.内置函数 ------------------------------ 1.面向过程编 ...
最新文章
- c语言两个数组按位合并,合并两个线性表(数组)并按照非递减排序输出,有点问题过来看看...
- C++类和对象的封装
- go与JAVA差异_20190312_浅谈gojava差异(二)
- 等待因该出现在while循环中,防止虚假唤醒
- 第14章:傅里叶变换
- python实现etl_为什么选择R而不是Python做ETL
- flume 一对多hdfs_10PB 规模的 HDFS 数据在 eBay 的迁移实战
- 首先请与所有现有链接到该网络共享的映射断开连接_疫情之下:该如何使用Python预测员工流失,老板直呼内行!...
- 使用Aptana搭建Python开发环境
- 置为底层_头一次见浴室装修这样设计,浴缸两头砌上置物台,实用又方便
- dhcp网络服务的搭建和配置
- Hadoop3.2.0使用详解
- 距离的度量(Dissimilarity Measure、Distance Metric)
- IOS开发中实现UITableView按照首字母将集合进行检索分组
- Java汉字转拼音实现方式
- 【基于Pytorch的手写汉字识别】
- RNA 提取步骤(trizol)
- mSystems:土壤化学计量特性影响土壤C、N和P循环微生物丰度及其对全球变化的抵抗力(一作解读)...
- 决策树ID3代码(Python)
- 随感 | 毕设风雨 | 前端之路 | 暗夜与旅人 | 早槐与龙鲤
热门文章
- 无线上网设备大集合,看看你的设备最适合哪种?
- vue核心之虚拟DOM(vdom)与真实DOM页面渲染过程
- 【操作系统】虚拟存储器--页面置换算法
- 无法加载文件C:\Users\TANG\AppData\Roaming\npm\nrm.ps1,因为在此系统上禁止运行脚本
- [附源码]计算机毕业设计JAVA校园征兵及退役复原管理系统
- space header page consists of zero bytes in data
- Java集合这样子学习
- SPI Flash芯片W25Q32英文版数据手册解读(二)---------存储器知识,寄存器
- 根键hkey_classes_root的作用
- ArcGIS Server 统计服务请求数等