JAVA零基础小白自学日志——第十七天
文章目录
- 1.方法的覆写
- 2.类的层次结构
- 3.如何判定正确的继承顺序
- 4.如何判断子类继承(继承这个词我始终觉得很变扭)了父类的什么
- 5.继承关系的实质
- 6.关键字:super 和 this
- [1].this关键字
- (1)this关键字调用本类属性
- (2)this关键字本类方法调用
- (3)this关键字使用的注意事项
- [2].super关键字
- (1)super关键字调用父类属性
- (2)super关键字调用父类方法
- [3].super关键字和this关键字的区别
今日提要:再谈继承
1.方法的覆写
儿子遗传了爹的鼻窦炎,还有哮喘(扩展基类或者说超类的方法和实例变量),可是儿子的鼻窦炎更高级了,儿子的诊断里面就增加自己特别的鼻窦炎(覆盖基类或超类的方法),这就是子类对父类(基类或超类)的覆写,这里注意实例变量是不会被覆写,因为实例变量不定义任何特殊的行为,它们只表达状态;
这里需要注意的是,方法的覆写,只针对这个子类,子类在实例化形成对象时,可以用自己的同名方法覆写父类(基类或超类)的方法,以达到子类个性化表达的作用。
用中文是为了比较好读,代码里别用…
鸟的行动是飞行(你要非跟我抬杠,鸵鸟不能飞,你也可以在写鸵鸟这个类的时候,直接覆写鸟类的行动…)
猫是在地面奔跑的,别说爬树,说我也不理你;
鸟是吃素的,猫是吃荤的,这都是它们自己的特点,所以为它们建立自己的相关方法,覆写基类里面的相同方法,以达到依据特点实例化的目的;
方法的调用,也是遵循从具体到通用的优先级管理,也就是说,当你X.eat();//调用一个吃的方法
的时候,JVM会从最底层的类开始依次向上寻找,首先出现的就直接调用,一句话概括,JVM会选择对特定对象最特定的那个版本调用;
2.类的层次结构
用动物举例这个比较好说明,我看的资料里面都用动物,看来大家都这么认为的。好比,猫、狗、狼和老虎四个对象,我们发现猫和老虎都属于猫科,那么抽象出来的猫科就是猫和老虎的父类,而狗和狼都属于犬科,同理犬科就是狗和狼的父类,然后犬科和猫科都是动物中的一个种类,那么就可以抽象出来动物类,那么动物类就是猫科和犬科的父类,这就是类的层次结构,这个应该很好懂,但是实际上抽象的过程想当考验逻辑能力和想象力,还是有个心理准备的好;
3.如何判定正确的继承顺序
我们怎么来确定我们建立的父类,是不是某个特定子类的父类呢?方法很简单,就是问一下是不是;
比如:男老师是不是老师呢?猫是不是动物?外科医生是不是医生?等等等等,只要这个问题的答案是肯定的,那么后面的类就是前面特定类的父类,还有一点很重要必须要注意,是不是这个问题是单向的,不能反过来问,如果反过来问也出现了肯定的答案,那么这个类的继承肯定是有问题的;
4.如何判断子类继承(继承这个词我始终觉得很变扭)了父类的什么
我们说过Java有四种访问权限,从严格到宽松,依次是private<default<proteced<public;
现在我们只讨论,两种情况:如果方法被private(私有)修饰,那么成员不可继承,如果方法被public(公共)修饰,成员可以继承;
5.继承关系的实质
其实继承关系的实质就是为一组类建立了统一的一个协议,并遵循协议运行,比如Java本身;
6.关键字:super 和 this
[1].this关键字
(1)this关键字调用本类属性
- this代表当前对象(调用类中方法或属性的那个对象)的引用;
- this只能在方法内部使用;
- this.属性名:表示对象自己的属性;
来看两段代码:
代码一
public class ThisTest {private int num;private String col;ThisTest(int num,String col){num = num;col = col;}public static void main(String[] args) {ThisTest t1 = new ThisTest(20,"oo");ThisTest t2 = new ThisTest(30,"oopp");System.out.println(t1.num +" , " + t2.num);System.out.println(t1.col +" , " + t2.col);}}
输出结果:
0,0
null,null
代码二
public class ThisTest {private int num;private String col;ThisTest(int num,String col){this.num = num;this.col = col;}public static void main(String[] args) {ThisTest t1 = new ThisTest(20,"oo");ThisTest t2 = new ThisTest(30,"oopp");System.out.println(t1.num +" , " + t2.num);System.out.println(t1.col +" , " + t2.col);}}
输出结果:
20,30
oo,oopp
当构造函数参数与实例变量同名时,实例变量就被屏蔽了,它们是无法通过构造函数直接赋值的,当添加了this关键字之后,就可以被对象赋值了,而this关键字指代的是 t1 和 t2,这两个对象的引用;
来看第三段代码
public class ThisTest {private int num;private String col;ThisTest(int tempnum,String tempcol){num = tempnum;col = tempcol;}public static void main(String[] args) {ThisTest t1 = new ThisTest(20,"oo");ThisTest t2 = new ThisTest(30,"oopp");System.out.println(t1.num +" , " + t2.num);System.out.println(t1.col +" , " + t2.col);}}
输出结果:
20,30
oo,oopp
自己看不同吧,太明显了
(2)this关键字本类方法调用
- this关键字调用构造函数必须在构造函数的第一行
public class ThisTest {private int num;private String col;ThisTest(int num){ this.num = num; }ThisTest(String col){this(20);this.col = col;}public static void main(String[] args) {ThisTest t1 = new ThisTest("oo");ThisTest t2 = new ThisTest("oopp");System.out.println(t1.num +" , " + t2.num);System.out.println(t1.col +" , " + t2.col);}}
输出结果:
20 , 20
oo , oopp
重载的构造函数里面的第一行this(20)
调用的就是ThisTest(int num){......}
,必须在第一行;
- this关键字调用本类方法
public class ThisTest {void move() {System.out.println("好好学习");}void result() {this.move();System.out.println("天天向上");}public static void main(String[] args) {ThisTest s1 = new ThisTest();s1.result();}}
输出结果:
好好学习
天天向上
this.move();
调用的就是方法void move() {...}
,调用方法的时候,无所谓第几行,就看你的需要了;
(3)this关键字使用的注意事项
- this关键字只可以用于普通的实例方法;
- this关键字不可以在静态方法或静态块中使用(main()函数就是静态方法);
[2].super关键字
(1)super关键字调用父类属性
说别的啥都没啥用,看代码吧
public class SuperTest {public static void main(String[] args) {SonClass s1 = new SonClass();s1.show();}}
class SuperClass{int num = 100;
}
class SonClass extends SuperClass{int num = 10;void show () {System.out.print("爹的num= " + super.num + " , " + "儿子的num= " + num);}
}
输出结果:
爹的num= 100 , 儿子的num= 10
子类里面的super.num
调用的就是父类class SuperClass{ int num = 100;}
里面的变量num的值;
(2)super关键字调用父类方法
- super关键字调用构造函数必须在第一行;
第一段代码:
class SuperClass{int num;String col;SuperClass(){}
}
class SonClass extends SuperClass{SonClass(){super();}
}
- 子类的构造函数必须依赖父类的构造函数而建立,如果父类的构造函数为无参空函数,
super();
是默认存在的,不需要写;
第二段代码:
class SuperClass{int num;String col;SuperClass(int num,String col){}
}
class SonClass extends SuperClass{SonClass(){super(20,"oo");}
}
- 父类的构造函数含有参数的,super关键字必须依照父类构造函数的参数列表填写;
- super关键字访问父类方法;
第三段代码:
public class SuperTest {public static void main(String[] args) {SonClass s1 = new SonClass();s1.result();}}
class SuperClass{void move() {System.out.println("好好学习");}
}
class SonClass extends SuperClass{void result() {super.move();System.out.println("天天向上");}
}
输出结果:
好好学习
天天向上
这个一看就明白了,不用多说了;
[3].super关键字和this关键字的区别
这就是为什么要把这两个关键字都放在这里一起说的原因了
- super()调用父类的构造函数,必须在构造函数的第一行,this()调用本类构造函数,必须在构造函数的第一行,看到这里大家应该明白一件事情了,super()和this()不能同时调用构造函数;
- this代表调用者这个对象,super代表父类对象的引用;
- this没有继承也能使用,super必须在继承条件下;
- this()本类构造,super()父类构造;
今天的内容就写到这里了,里面太多中文要翻译成中文了,非常费劲
相关文章:

JAVA零基础小白自学日志——第十七天
文章目录 1.方法的覆写2.类的层次结构3.如何判定正确的继承顺序4.如何判断子类继承(继承这个词我始终觉得很变扭)了父类的什么5.继承关系的实质6.关键字:super 和 this[1].this关键字(1)this关键字调用本类属性&#x…...

electron中app.whenReady()和app.on(‘ready‘)的区别
app.whenReady和app.on(‘ready’)都是用于在Electron应用程序中处理初始化完成事件的方法。app.whenReady是一个返回Promise的方法,它会在应用程序准备好创建窗口时解决。一旦app.whenReady被调用,就可以安全地创建窗口,因为此时Electron的初…...

技术速递|Let’s Learn .NET Aspire – 开始您的云原生之旅!
作者:James Montemagno 排版:Alan Wang Let’s Learn .NET 是我们全球性的直播学习活动。在过去 3 年里,来自世界各地的开发人员与团队成员一起学习最新的 .NET 技术,并参加现场研讨会学习如何使用它!最重要的是&#…...

JSONNode树形解析或流式解析
哈喽,大家好,我是木头左! 什么是JSONNode? JSONNode是一个用于处理JSON数据的数据结构,它提供了一种简单、灵活、高效的方式来操作JSON数据。JSONNode可以看作是一个树形结构,其中每个节点都可以包含一个值…...

自制迷宫游戏 c++
竞赛的同时也不能忘记娱乐,劳逸结合,我们自研了迷宫游戏,只能在DEV C 运行哦 #include<bits/stdc.h> #include<iomanip> #include<iostream> #include<cstdlib> #include<ctime> #include<conio.h> #include<win…...

基于复旦微JFMQL100TAI的全国产化FPGA+AI人工智能异构计算平台,兼容XC7Z045-2FFG900I
基于上海复旦微电子FMQL45T900的全国产化ARM核心板。该核心板将复旦微的FMQL45T900(与XILINX的XC7Z045-2FFG900I兼容)的最小系统集成在了一个87*117mm的核心板上,可以作为一个核心模块,进行功能性扩展,能够快速的搭建起…...

【数学建模】技术革新——Lingo的使用超详解
目录 基础知识 1. 变量声明 示例 2. 常量声明 语法格式 示例 3. 目标函数 语法格式 示例 4. 约束条件 语法格式 示例 5. 完整的Lingo模型示例 示例 解释 6. 整数变量声明 语法格式 示例 7. 非线性规划 示例 8. 多目标优化 语法格式 示例 9. 数据输入与…...

LLM-阿里 DashVector + langchain self-querying retriever 优化 RAG 实践【Query 优化】
文章目录 前言self querying 简介代码实现总结 前言 现在比较流行的 RAG 检索就是通过大模型 embedding 算法将数据嵌入向量数据库中,然后在将用户的查询向量化,从向量数据库中召回相似性数据,构造成 context template, 放到 LLM 中进行查询…...

【python】PyQt5的窗口界面的各种交互逻辑实现,轻松掌控图形化界面程序
✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…...

DockerCompose介绍,安装,使用
DockerCompose 1、Compose介绍 将单机服务-通过Dockerfile 构建为镜像 -docker run 成为一个服务 user 8080 net 7000 pay 8181 admin 5000 监控 .... docker run 单机版、一个个容器启动和停止问题: 前面我们使用Docker的时候,定义 Dockerfil…...

N叉树的前序遍历
Problem: 589. N 叉树的前序遍历 文章目录 思路解题过程Code 思路 前序遍历,遇到空节点返回 解题过程 对每个节点进行遍历 Code /* // Definition for a Node. class Node { public:int val;vector<Node*> children;Node() {}Node(int _val) {val _val;}Nod…...

Linux C++ 054-设计模式之外观模式
Linux C 054-设计模式之外观模式 本节关键字:Linux、C、设计模式、外观模式 相关库函数: 概念 外观模式(Facade),亦称“过程模式”。主张按照描述和判断资料来评价课程,关键的活动是在课程实施的全过程中…...

Linux - 冯-诺依曼体系结构、初始操作系统
目录 冯•诺依曼体系 结构推导 内存提高效率的方法 数据的流动过程 体系结构相关知识 初始操作系统 定位 设计目的 操作系统之上之下分别有什么 管理精髓:先描述,再组织 冯•诺依曼体系 结构推导 计算机基本工作流程图大致如下: 输入设备&a…...

成功适配!极验设备指纹HarmonyOS 鸿蒙版官方下载
近日,华为开发者大会(HDC 2024)在东莞召开。在大会开幕日的首场主题演讲中,华为宣布当前已有TOP5000应用成为鸿蒙原生应用,350+SDK已适配HarmonyOS NEXT版本。其中,极验作为其重要伙伴ÿ…...

【C++】字符串学习 知识点+代码记录
一.知识点总结 1. C风格字符串(字符数组) 字符数组存储字符串:C风格的字符串实际上是字符数组,以空字符\0作为结尾标志。字符串字面量与字符数组:字符串字面量如"Hello"被编译器视为const char*类型&#…...

尝试理解docker网络通信逻辑
一、docker是什么 Docker本质是一个进程,宿主机通过namespace隔离机制提供进程需要运行基础环境,并且通过Cgroup限制进程调用资源。Docker的隔离机制包括 network隔离,此次主要探讨网络隔离mount隔离hostname隔离user隔离pid隔离进程通信隔离 二、doc…...

数据仓库哈哈
数据仓库 基本概念数据库(database)和数据仓库(Data Warehouse)的异同 整体架构分层架构方法论ER模型(建模理论)维度模型 何为分层第一层:数据源(ODS ER模型)设计要点日志…...

K最近邻(K-Nearest Neighbors, KNN)
K最近邻(K-Nearest Neighbors, KNN)理论知识推导 KNN算法是一个简单且直观的分类和回归方法,其基本思想是:给定一个样本点,找到训练集中与其最近的K个样本点,根据这些样本点的类别(分类问题&am…...

深度学习损失计算
文章目录 深度学习损失计算1.如何计算当前epoch的损失?2.为什么要计算样本平均损失,而不是计算批次平均损失? 深度学习损失计算 1.如何计算当前epoch的损失? 深度学习中的损失计算,通常为数据集的平均损失࿰…...

论文翻译:通过云计算对联网多智能体系统进行预测控制
通过云计算对联网多智能体系统进行预测控制 文章目录 通过云计算对联网多智能体系统进行预测控制摘要前言通过云计算实现联网的多智能体控制系统网络化多智能体系统的云预测控制器设计云预测控制系统的稳定性和一致性分析例子结论 摘要 本文研究了基于云计算的网络化多智能体预…...

Java核心(五)多线程
线程并行的逻辑 一个线程问题 起手先来看一个线程问题: public class NumberExample {private int cnt 0;public void add() {cnt;}public int get() {return cnt;} }public static void main(String[] args) throws InterruptedException {final int threadSiz…...

IDEA快速生成项目树形结构图
下图用的IDEA工具,但我觉得WebStorm 应该也可以 文章目录 进入项目根目录下,进入cmd输入如下指令: 只有文件夹 tree . > list.txt 包括文件夹和文件 tree /f . > list.txt 还可以为相关包路径加上注释...

【CPO-TCN-BiGRU-Attention回归预测】基于冠豪猪算法CPO优化时间卷积双向门控循环单元融合注意力机制
基于冠豪猪算法CPO(Correlation-Preservation Optimization)优化的时间卷积双向门控循环单元(Bidirectional Gated Recurrent Unit,BiGRU)融合注意力机制(Attention)的回归预测需要详细的实现和…...

面试高级 Java 工程师:2024 年的见闻与思考
面试高级 Java 工程师:2024 年的见闻与思考 由于公司业务拓展需要,公司招聘一名高级java工程研发工程师,主要负责新项目的研发及老项目的维护升级。我作为一名技术面试官,参与招聘高级 Java 工程师,我见证了技术领域的…...

设计模式大白话之装饰者模式
想象一下,你走进一家咖啡馆,点了一杯美式咖啡。但是,你可能还想根据自己的口味添加一些东西,比如奶泡、巧克力粉、焦糖酱或是肉桂粉。每次你添加一种配料,你的咖啡就会变得更丰富,同时价格也会相应增加。 在…...
动手学深度学习6.3 填充和步幅-笔记练习(PyTorch)
以下内容为结合李沐老师的课程和教材补充的学习笔记,以及对课后练习的一些思考,自留回顾,也供同学之人交流参考。 本节课程地址:填充和步幅_哔哩哔哩_bilibili 代码实现_哔哩哔哩_bilibili 本节教材地址:6.3. 填充和…...

函数的形状怎么定义?
在TypeScript中,函数的形状可以通过多种方式定义,以下是几种主要的方法: 1、函数声明:使用function关键字声明函数,并直接在函数名后的括号内定义参数,通过冒号(:)指定参数的类型&a…...

Windows 虚拟机服务器项目部署
目录 一、部署JDK下载JDK安装JDK1.双击 jdk.exe 安装程序2.点击【下一步】3.默认安装位置,点击【下一步】4.等待提取安装程序5.默认安装位置,点击【下一步】6.等待安装7.安装成功,点击【关闭】 二、部署TomcatTomcat主要特点包括:…...

JDBC(2)基础篇2——增删改查及常见问题
目录 一、基于PreparedStatement实现CRUD 1.查询单行单列 2.查询单行多列 3.查询多行多列 4.新增 5.修改 6.删除 7.总结 二、常见问题 1.资源的管理 2.SQL语句问题 3.SQL语句未设置参数问题 4.用户名或密码错误问题 5.通信异常 总结 一、基于PreparedStatement实…...

JVM知识点梳理
目录标题 1.类加载机制1.1 Java 运行时一个类是什么时候被加载的?1.2 JVM 一个类的加载过程?1.3 一个类被初始化的过程?1.4 继承时父子类的初始化顺序是怎样的?1.5 究竟什么是类加载器?1.6 JVM 有哪些类加载器?1.7 JVM 中不同的类加载器加载哪些文件?1.8 JVM 三层类加载…...