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的损失? 深度学习中的损失计算,通常为数据集的平均损失࿰…...

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

Linux应用开发之网络套接字编程(实例篇)
服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...
前端倒计时误差!
提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...

Day131 | 灵神 | 回溯算法 | 子集型 子集
Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣(LeetCode) 思路: 笔者写过很多次这道题了,不想写题解了,大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...
Java 加密常用的各种算法及其选择
在数字化时代,数据安全至关重要,Java 作为广泛应用的编程语言,提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景,有助于开发者在不同的业务需求中做出正确的选择。 一、对称加密算法…...
工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配
AI3D视觉的工业赋能者 迁移科技成立于2017年,作为行业领先的3D工业相机及视觉系统供应商,累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成,通过稳定、易用、高回报的AI3D视觉系统,为汽车、新能源、金属制造等行…...

优选算法第十二讲:队列 + 宽搜 优先级队列
优选算法第十二讲:队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的“no matching...“系列算法协商失败问题
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的"no matching..."系列算法协商失败问题 摘要: 近期,在使用较新版本的OpenSSH客户端连接老旧SSH服务器时,会遇到 "no matching key exchange method found", "n…...

push [特殊字符] present
push 🆚 present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中,push 和 present 是两种不同的视图控制器切换方式,它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...

宇树科技,改名了!
提到国内具身智能和机器人领域的代表企业,那宇树科技(Unitree)必须名列其榜。 最近,宇树科技的一项新变动消息在业界引发了不少关注和讨论,即: 宇树向其合作伙伴发布了一封公司名称变更函称,因…...
多模态图像修复系统:基于深度学习的图片修复实现
多模态图像修复系统:基于深度学习的图片修复实现 1. 系统概述 本系统使用多模态大模型(Stable Diffusion Inpainting)实现图像修复功能,结合文本描述和图片输入,对指定区域进行内容修复。系统包含完整的数据处理、模型训练、推理部署流程。 import torch import numpy …...