权限修饰符,代码块,抽象类,接口.Java
1,权限修饰符
- 权限修饰符:用来控制一个成员能够被访问的范围
- 可以修饰成员变量,方法,构造方法,内部类
👻👗👑权限修饰符的分类
- 🧣四种作用范围由小到大(private<空着不写<protected<public)
修饰符 | 同一个类中 | 同一个包中的其他类 | 不同包下的子类 | 不同包下的无关类 |
---|---|---|---|---|
private | √ | |||
空着不写 | √ | √ | ||
protected | √ | √ | √ | |
public | √ | √ | √ | √ |
- 🧣private:私房钱,只能自己用
- 🧣空着不写:只能本包中能用
- 🧣protected:受保护的
- 🧣public:公共的
2,代码块
👻含义:
👻代码块分类
- 局部代码块:写在方法或语句中的代码块 。
📝注意:变量的作用范围只在所属的代码块有效,出了代码块,就无法使用
📝作用:提前结束变量的声明周期
- 构造代码块
写在成员位置的代码块,在创建本类对象时,会优先与构造方法执行(每次创建对象时都会执行)。可以把多个构造方法中重复的代码写在构造代码块中。(这个方法过于死板,一般采用下面两个方法)
- 静态代码块
格式:static{},在构造代码块的基础上加了static
特点:需要通过static关键字修饰,随着类的加载而加载 ,并且自动触发,只执行一次。
3,抽象类
一、什么是抽象类
🍑我们之前学过什么是类,那么抽象类是不是也是类的一种呢?
听名字就感觉好抽象呀!说对了,他就是抽象的,不是具体的。在类中没有包含足够的信息来描绘一个具体的对象,这样的类称为抽象类。
🌰来看一个抽象类的例子
// 抽象类和抽象方法需要被 abstract 关键字修饰
abstract class Shape {// 抽象类中的方法一般要求都是抽象方法,抽象方法没有方法体abstract void draw();
}
大家觉得这个抽象类是不是什么也没干,他唯一的方法draw()还是空的。
像这样的类是不是就没有包含足够的信息来描绘一个具体的对象,自然也就不能实例化对象了。不信你看:
🍑那既然一个类不能实例化,那这种抽象类存在的意义是什么呀🤔?别急,存在即合理,听我慢慢道来。
二,抽象类在实现多态中的意义
🍑抽象类存在的一个最大意义就是被继承,当被继承后就可以利用抽象类实现多态。
来看一段代码
// 抽象类和抽象方法需要被 abstract 关键字修饰
abstract class Shape {// 抽象类中的方法一般要求都是抽象方法,抽象方法没有方法体abstract void draw();
}
// 当一个普通类继承一个抽象类后,这个普通类必须重写抽象类中的方法
class Cycle extends Shape {@Overridevoid draw() { // 重写抽象类中的draw方法System.out.println("画一个圆圈");}
}public class Test4 {public static void main(String[] args) {//Shape shape = new Shape(); 抽象类虽然不能直接实例化// 但可以把一个普通类对象传给一个抽象类的引用呀,即父类引用指向子类对象Shape shape = new Cycle(); // 这称作:向上转型/*Cycle cycle = new Cycle();Shape shape = cycle // 这是向上转型的另一种写法*/shape.draw(); // 通过父类引用调用被子类重写的方法}
}
运行之后你就会发现神奇的一幕:
📝什么是向上转型:一句话总结就是“父类引用指向子类对象”
向上转型后的变化
🏀关于方法:父类引用可以调用子类和父类公用的方法(如果子类重写了父类的方法,则调用子类的方法),但子类特有的方法无法调用。
🏀关于属性: 父类引用可以调用父类的属性,不可以调用子类的属性
向上转型的作用
🐟减少一些重复性的代码
🐟对象实例化的时候可以根据不同需求实例化不同的对象
🌰这样的话就我们上面的代码就可以理解了
🎀看来,我们可以通过子类对抽象类进行继承和重写,抽象类还真有点用呀!
🍑但这和多态有什么关系呢,抽象类用起来这么麻烦,我还不如直接用普通类,也能达到这样的效果,还不用再写一个子类呢😫?
🐟🐟🐟🐟🐟🐟🐟🐟🐟🐟🐟🐟🐟🐟🐟🐟
🌰那行,你再看看下面的代码,你就知道抽象类在实现多态时的好处了。
abstract class Shape {public abstract void draw(); // 抽象方法不能里有具体的语句
}
// 当一个普通类继承一个抽象类的时候,再这个子类中必须重写抽象类中的抽象方法
class Cycle extends Shape { @Override // 如果不重写会报错,但如果继承的是普通类则不会报错,用抽象类更安全public void draw() {System.out.println("画一个圆圈");}
}
class Flower extends Shape { // 不同的子类对父类的draw方法进行了不同的重写@Overridepublic void draw() {System.out.println("画一朵花");}
}
class Square extends Shape {@Overridepublic void draw() {System.out.println("画一个正方形");}
}public class Test4 {public static void main(String[] args) {Cycle cycle = new Cycle(); // 子类引用cycleFlower flower = new Flower(); // 子类引用flowerSquare square = new Square();// 数组的类型是Shape,即数组中每一个元素都是一个父类引用// 在这个过程其实也发生了向上转型,对抽象类中的方法进行了重写Shape[] shapes = {cycle, flower, square}; // 父类引用引用不同的子类对象for (int i = 0; i < shapes.length; i++) {Shape shape = shapes[i]; // 父类引用shape指向—>当前所对应的子类对象shape.draw(); // 通过父类引用调用子类重写的draw方法}}
}
✨结果
🎠调用同一个方法竟然打印出了不同的结果😮,这难道就是所谓的多态🤔
🧶🧶🧶🧶🧶🧶🧶🧶🧶🧶🧶🧶🧶🧶🧶🧶
🎃原因就是
// 对上面的代码补充一下
// 可能你对 Shape[] shapes = {cycle, flower, square};不太理解
// 但上面的代码就相当于 Shape[] shapes1 = new Shape[3]; // 有三个不同的子类对象呀!数组大小为3// (将指向->子类对象)的子类引用赋值给父类对象,不就相当于该夫类引用指向->所对应的子类对象吗
//这是向上转型的另一种写法,应为前面已经实例化了子类对象 Cycle cycle = new Cycle(); shapes1[0] = cycle; // 如果前面没实例化子类对象,就要写成shape1[0] = new Cycleshapes1[1] = flower;shapes1[2] = square;
🎈对于多态来说,他有这三个要素
- 继承(我们刚才的Cycle类继承Shape抽象类)
- 重写(我们子类对draw方法的重写)
- 父类指向子类对象(就是shape1[0] = cycle -->也可以称作向上转型)
🍑回头再看一下我们的代码,是不是就刚好符合了多态的三要素😉。
📝当我们的父类引用指向不同的子类对象时,当我们调用同一个draw方法时却输出了不同的结果。(其实就是该方法再子类中被重写成了不同形式)这就叫做多态 。
嘻嘻😂,其实只要只要结合着例子来看,多态也没那么难理解呀😎
🍑那为啥一定要用抽象类呢😂?我一个普通类继承普通类来实现多态不可以吗🤔
🌰当然可以,但不太安全有风险;
但如果是抽象类的话,就不一样了😉
🍑从这我们也可以看出,当用抽象类的时候,编译器自动就对我们是否重写进行了校验,而充分利用编译器的校验, 在实际开发中是非常有意义的 。所以说抽象类还是有用的,嘻嘻😉
📝好了,相信到这里你对抽象类也有了一个大概的认识😊,下面我们来简单做一下总结
- 使用abstract修饰的类或方法,就是抽象类或者抽象方法
- 抽象类不能具体的描述一个对象,也就是说不能实例化对象
- 抽象类里面的成员变量,都是和普通的类一样;成员方法要加abstract,且没有结构体
- 当一个普通类继承抽象类是,这个普通类必须重写抽象类中所有的抽象方法(🍑因为我们之前说抽象类不是具体的,没有包含足够的信息来描述一个对象,所以我们必须把他补充完整)
- 但当一个抽象类A继承了抽象类B,这时抽象类A就可以不重写抽象类B中的抽象方法
- final不能修饰抽象类和抽象方法(抽象类存在的最大意义就是被继承,而被final修饰的类不能被重写,final和抽象,它们两个就是天敌🎈🎈🎈🎈)
- 抽象方法不能被private修饰(抽象方法就是被重写的,被private修饰了,还怎么重写)
- 抽象类中不一定有抽象方法,但一个类中由抽象方法,那么这个类一定是抽象类
🐟🐟🐟🐟🐟🐟🐟🐟🐟🐟🐟🐟🐟🐟🐟🐟
4,接口
一,介绍
👻🧣👑🥇🧸接口用于描述类具有什么功能,但不给出具体实现,当某个类要使用接口时,再去实现接口中的方法。类需要遵循接苦衷描述的统一规则进行定义,所以接口是对外提供的一组规则,标准。
二,定义
🦄定义接口要用到关键字interface
- interface 接口名{}
🦄类和接口之间不是继承关系,而是实现关系,用implements关键字表示。
- class 类名 implements 接口名{}
🧩需要注意的是:与类的定义相似,接口的访问权限修饰符只能是public或者默认
三,特点
🎨🎨接口成员变量的特点🎨🎨:没有成员变量,只有公共静态常量,即在默认情况下都会有public static final 这三个关键字修饰。如下:
- public static final 数据类型 常量名=常量值;
🧩注意:final关键字中要求,final属性必须初始化,而对于共有静态常量 (public static final),初始化的途径只有两条------①定义时显示初始化;②在静态代码块中初始化。但是,接口中不允许出现代码块,而且接口中没有构造方法。因此,要求我们在接口中定义公共静态常量时,必须在定义时就赋值。否则IDEA就报错。
🎨🎨接口成员方法的特点🎨🎨:
①在TDK7.0版本及其之前的版本中,接口中仅支持只有公共抽象方法。如下:
- public abstract 返回值类型 方法名();
🧩事实上,接口中的方法默认就是共有抽象方法,因此在定义时省略也可以。
②从JDK8.0开始就可以有默认方法和静态方法:
- 默认方法-----public default 返回值类型 方法名(){}
- 静态方法-----public static 返回值类型 方法名(){}
🧩注意,想要在接口中定义默认方法必须在前面加default关键字 ,因为接口中的方法你什么都不写,默认的就是共有抽象方法。默认方法可以有方法体,且不需要实现类取实现,其实就是我们平时见到的普通成员方法。但是默认方法是可以被实现重写的(不需要强制重写,需要用到再重写)。default关键字只能在接口中使用,就算实现类要重写方法也不能添加default修饰符,不然JDK报错;如果实现多个接口,不同接口中方法名相同,就必须要重写。
🧩静态方法只能通过接口名调用,不能通过类名或对象名进行调用,且不能被重写(重写是对虚方法表里面的方法进行重写覆盖掉,而static,final,private不在虚方法表里面)
③JDK9.0以后,接口中可以有私有方法(private和private static)
- private 返回值类型 方法名(){}
🎨🎨接口中构造方法的特点🎨🎨:
①接口不能被实例化🧸:
- 只能通过多态的方式实例化“子类”对象(这里的“子类”是指接口的实现类)
②接口的子类(实现类)🧸:
- 可以是抽象类,也可以是普通类
🧩对于抽象实现类,可以不用实现接口中的所有方法,因为抽象类本身就容许存在抽象方法,语法上是通过的;
🧩对于普通实现类 ,要实现接口中所以抽象方法。
批量实现抽象类的方法:alt+enter
四,接口继承关系的特点
👗①类和接口之间的关系
- 类和接口是实现关系,支持多实现,即一个类可以实现多个接口
👗②接口和接口之间的关系
- 接口和接口之间是继承关系,即一个接口可以同时继承多个接口,格式如下:
接口 extends 接口1,接口2,.......
👗③ 继承和实现的关系
- 🧩继承体现的是"is a"的关系,父类中定义共性内容
- 🧩实现体现的是"like a"的关系,父接口中定义扩展内容
五,适配器
👗当一个接口中的抽象方法过多时,但是我们只要其中一部分的时候,就可以用适配器设计模式
👗书写步骤:
- 编写中间类XXXAdapter,实现对应的接口;
- 对接口中的抽象方法进行空实现;
- 让真正的实现类继承中间类,并重写需要的方法;
- 为了避免其他类创建适配器类的对象,中间的适配器类用abstract修饰
六,案例
👗👑🥇结果:
相关文章:

权限修饰符,代码块,抽象类,接口.Java
1,权限修饰符 权限修饰符:用来控制一个成员能够被访问的范围可以修饰成员变量,方法,构造方法,内部类 👻👗👑权限修饰符的分类 🧣四种作用范围由小到大(private<空着…...

CSS设置文本
目录 概述: text-aling: text-decoration: text-transform: text-indent: line-height: letter-spacing: word-spacing: text-shadow: vertical-align: white-space: direction: 概述: 在CSS中我们可以设置文本的属性,就像Word文…...
【svg】—— java提取svg中的颜色
需要针对svg元素进行解析,并提取其中的颜色,首先需要知道svg中的颜色。针对svg中颜色的格式大致可以一般有纯色和渐变两种形式。对于渐变有分为:线性渐变和放射性渐变针对svg中的颜色支持16进制的格式,又可以支持RGB的格式&#x…...

论文分享 | FAST'23 阿里云提出的针对SMR优化的存储引擎SMRSTORE
今天分享的一篇最近阅读的论文是FAST23的SMRstore: A Storage Engine for Cloud Object Storage on HM-SMR Drives。 https://www.usenix.org/conference/fast23/presentation/zhou 这篇文章是由阿里巴巴公司完成的,在这篇文章中,团队针对SMR的特性提出了…...

题目:建造房屋 (蓝桥OJ3362)
问题描述: 代码: #include<bits/stdc.h> using namespace std; int n, m, k, ans, mod 1e9 7; long long dp[55][2605]; /*dp[i][j]:第i个街道上建j个房屋的总方案数枚举所有的转移,累加到dp[n][k]即总方案数 */ int main() {cin >> n &…...

智能合约平台开发指南
随着区块链技术的普及,智能合约平台已经成为了这个领域的一个重要趋势。智能合约可以自动化执行合同条款,大大减少了执行和监督合同条款所需的成本和时间。那么,如何开发一个智能合约平台呢?以下是一些关键步骤。 一、选择合适的区…...

数学建模-最优包衣厚度终点判别法(主成分分析)
💞💞 前言 hello hello~ ,这里是viperrrrrrr~💖💖 ,欢迎大家点赞🥳🥳关注💥💥收藏🌹🌹🌹 💥个人主页ÿ…...

Mysql内存表及使用场景(12/16)
内存表(Memory引擎) InnoDB引擎使用B树作为主键索引,数据按照索引顺序存储,称为索引组织表(Index Organized Table)。 Memory引擎的数据和索引分开存储,数据以数组形式存放,主键索…...

Django交易商场
Hello,我是小恒不会java 最近学习django,写了一个demo,学到了不少东西。 我在GitHub上开源了,提示‘自行查看代码,维护,运行’。 最近有事,先发布代码了,我就随缘维护更新吧 介绍: 定…...

华为校园公开课走入上海交大,鸿蒙成为专业核心课程
4月12日,华为校园公开课在中国上海交通大学成功举办,吸引了来自计算机等相关专业的150余名学生参加。据了解,由吴帆、陈贵海、过敏意、吴晨涛、刘生钟等教授在中国上海交通大学面向计算机系本科生开设的《操作系统》课程,是该系学…...

【会员单位】泰州玉安环境工程有限公司
中华环保联合会理事单位 水环境治理专业委员会副主任委员单位 我会为会员单位提供服务: 1、企业宣传与技术项目对接; 2、企业标准、行业标准制定; 3、院士专家指导与人才培训 4、国际与国内会议交流 5、专精特新、小巨人等申报认证 6…...

Google视觉机器人超级汇总:从RT、RT-2到AutoRT/SARA-RT/RT-Trajectory、RT-H
前言 随着对视觉语言机器人研究的深入,发现Google的工作很值得深挖,比如RT-2 想到很多工作都是站在Google的肩上做产品和应用,Google真是科技进步的核心推动力,做了大量大模型的基础设施,服(推荐重点关注下Googl…...

LeetCode-1143. 最长公共子序列【字符串 动态规划】
LeetCode-1143. 最长公共子序列【字符串 动态规划】 题目描述:解题思路一:动规五部曲解题思路二:1维DP解题思路三:0 题目描述: 给定两个字符串 text1 和 text2,返回这两个字符串的最长 公共子序列 的长度。…...

从0开始创建单链表
前言 这次我来为大家讲解链表,首先我们来理解一下什么是单链表,我们可以将单链表想象成火车 每一节车厢装着货物和连接下一个车厢的链子,单链表也是如此,它是将一个又一个的数据封装到节点上,节点里不仅包含着数据&…...

STC89C52学习笔记(十)
STC89C52学习笔记(十) 综述:本文介绍了DS18B20和单总线协议,以及讲述了如何使用DS18B20测量温度。 一、单总线协议 1.只有一根通讯线:DQ (常见的运用单总线的两种设备:DS18B20和DHT11&#…...

初识二叉树和二叉树的基本操作
目录 一、树 1.什么是树 2. 与树相关的概念 二、二叉树 1.什么是二叉树 2.二叉树特点 3.满二叉树与完全二叉树 4.二叉树性质 相关题目: 5.二叉树的存储 6.二叉树的遍历和基本操作 二叉树的遍历 二叉树的基本操作 一、树 1.什么是树 子树是不相交的;…...

如何开辟动态二维数组(C语言)
1. 开辟动态二维数组 C语言标准库中并没有可以直接开辟动态二维数组的函数,但我们可以通过动态一维数组来模拟动态二维数组。 二维数组其实可以看作是一个存着"DataType []"类型数据的一维数组,也就是存放着一维数组地址的一维数组。 所以&…...

【MATLAB第104期】基于MATLAB的xgboost的敏感性分析/特征值排序计算(针对多输入单输出回归预测模型)
【MATLAB第104期】基于MATLAB的xgboost的敏感性分析/特征值排序计算(针对多输入单输出回归预测模型) 因matlab的xgboost训练模型不含敏感性分析算法,本文通过使用single算法,即单特征因素对输出影响进行分析,得出不同…...

C语言程序与设计——工程项目开发
之前我们已经了解了C语言的基础知识部分,掌握这些之后,基本就可以开发一些小程序了。在开发时,就会出现合作的情况,C语言是如何协作开发的呢,将在这一篇文章进行演示。 工程项目开发 在开发过程中,你接到…...

【Java核心技术】第6章 接口
1 接口 接口不是类,而是对希望符合这个接口的类的一组需求 1.1 Comparable 接口 要对对象进行比较,就要实现(implement)比较(comparable)接口 注意: implements Comparable<Manager> Comparable接口是泛型接口 class Manager exten…...

CTF show Web 红包题第六弹
提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框,很难让人不联想到SQL注入,但提示都说了不是SQL注入,所以就不往这方面想了 先查看一下网页源码,发现一段JavaScript代码,有一个关键类ctfs…...

渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止
<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet: https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...

tree 树组件大数据卡顿问题优化
问题背景 项目中有用到树组件用来做文件目录,但是由于这个树组件的节点越来越多,导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多,导致的浏览器卡顿,这里很明显就需要用到虚拟列表的技术&…...

Mysql中select查询语句的执行过程
目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析(Parser) 2.4、执行sql 1. 预处理(Preprocessor) 2. 查询优化器(Optimizer) 3. 执行器…...

Netty从入门到进阶(二)
二、Netty入门 1. 概述 1.1 Netty是什么 Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients. Netty是一个异步的、基于事件驱动的网络应用框架,用于…...

mac 安装homebrew (nvm 及git)
mac 安装nvm 及git 万恶之源 mac 安装这些东西离不开Xcode。及homebrew 一、先说安装git步骤 通用: 方法一:使用 Homebrew 安装 Git(推荐) 步骤如下:打开终端(Terminal.app) 1.安装 Homebrew…...

群晖NAS如何在虚拟机创建飞牛NAS
套件中心下载安装Virtual Machine Manager 创建虚拟机 配置虚拟机 飞牛官网下载 https://iso.liveupdate.fnnas.com/x86_64/trim/fnos-0.9.2-863.iso 群晖NAS如何在虚拟机创建飞牛NAS - 个人信息分享...

嵌入式学习之系统编程(九)OSI模型、TCP/IP模型、UDP协议网络相关编程(6.3)
目录 一、网络编程--OSI模型 二、网络编程--TCP/IP模型 三、网络接口 四、UDP网络相关编程及主要函数 编辑编辑 UDP的特征 socke函数 bind函数 recvfrom函数(接收函数) sendto函数(发送函数) 五、网络编程之 UDP 用…...
【深尚想】TPS54618CQRTERQ1汽车级同步降压转换器电源芯片全面解析
1. 元器件定义与技术特点 TPS54618CQRTERQ1 是德州仪器(TI)推出的一款 汽车级同步降压转换器(DC-DC开关稳压器),属于高性能电源管理芯片。核心特性包括: 输入电压范围:2.95V–6V,输…...

基于stm32F10x 系列微控制器的智能电子琴(附完整项目源码、详细接线及讲解视频)
注:文章末尾网盘链接中自取成品使用演示视频、项目源码、项目文档 所用硬件:STM32F103C8T6、无源蜂鸣器、44矩阵键盘、flash存储模块、OLED显示屏、RGB三色灯、面包板、杜邦线、usb转ttl串口 stm32f103c8t6 面包板 …...