Java基础知识快速盘点(三)
一,构造器
创建一个类的方法时会调用该类的构造器
构造器,也叫构造方法
构造器是属于类的,对象不可调用
构造方法没有返回值类型
构造方法一般用public修饰,也可用private修饰,例如
public class Test {private Test() { // 这个构造器外部无法调用super();}public static Test getTest() {return new Test();} }
如果用户没有定义构造器,创建类的对象时会调用默认的无参构造器,用户定义构造器后,创建类的对象时会调用用户定义的构造器
public class A {}class B {public static void main(String[] args) {// new关键字会在堆区开辟出一块内存空间用于存放真正的对象// 对象创建完成后会返回一个该类的引用赋值给该类的引用变量A a = new A();} }
成员变量:位于内存中的堆区
局部变量:位于内存中的栈区
当局部变量名和成员变量名相同时,采取就近原则
二,方法重载
- 方法重载出现在同一个类中
- 方法名相同,参数列表不同,其他不做限制,这种现象就叫方法重载
- 构造器也可以进行方法重载,构造器也是方法
三,static关键字
static可以用来修饰属性,方法(构造器除外),代码块,类(静态内部类)
静态成员存放在内存中的静态区,静态区的内容会随类的加载加载到内存
静态成员只有当类被卸载的时候随类的卸载而退出内存
静态成员不能访问类中的非静态成员
static修饰属性(静态属性)
- static修饰的属性属于类本身
- static修饰的属性推荐的访问方式为:
类名.静态属性
- 一般不建议使用构造器对静态属性进行初始化
static修饰方法(静态方法)
- 推荐访问方式:
类名.静态方法
static修饰代码块(静态代码块)
静态代码块会在类加载的时候自动执行
静态代码块,匿名代码块,构造器执行顺序
静态代码块(只执行一次) -> 匿名代码块 ->构造器
静态代码块只会执行一次,因为类只会加载一次
jvm加载字节码文件会先从有main方法的文件加载
public class Test {static {System.out.println("静态代码块");}// 匿名代码块会在构造器之前执行{System.out.println("匿名代码块");}public Test() {System.out.println("构造器");}public static void main(String[] args) {new Test();System.out.println("------------------");new Test();} }/*******执行结果************** 静态代码块 匿名代码块 构造器 ------------------ 匿名代码块 构造器 */
四,封装
属性封装
- 使用private修饰,提供公共访问方法
方法封装
- 将冗余的代码或功能重复的代码封装为一个方法
类
- 类本身就是一种封装
五,继承
class 子类 extends 父类 {}
父类当中的私有属性子类不可直接访问
在创建子类的对象时,会先去调用父类的无参构造器,然后再调用子类的构造器
若父类中没有无参构造器,子类在创建对象时若用户没有主动调用父类的构造器,程序将编译报错,因为在父类中找不到相应的无参构造器;
class A {private int i;public A(int i) {this.i = i;} }public class B extends A {// 该静态代码块不会执行,因为文件无法通过编译static {System.out.println("m");}public static void main(String[] args) {new B(); // 编译报错,父类中找不到相应的无参构造器} }
结合静态代码块和匿名代码块
class A {static {System.out.println("A static");}{System.out.println("A 匿名");}public A() {System.out.println("A");} } public class Main extends A {public Main() {System.out.println("Main");}static {System.out.println("Main static");}{System.out.println("Main 匿名");}public static void main(String[] args) {new Main();System.out.println("-----------------------");new Main();} }/********运行结果************ A static Main static A 匿名 A Main 匿名 Main ----------------------- A 匿名 A Main 匿名 Main */
this 和 super
- this代表当前对象的引用
- super代表本类当前对象的父类内存空间标识
- this可以调用本类的成员变量,也可以调用父类的成员变量
- super调用父类的成员变量
- this调用本类构造器
- super调用父类构造器
- this可以调用本类的方法,也可调用父类的方法
- super调用父类的方法
六,方法重写
- 方法名,参数列表与父类中要重写的方法相同
- 修饰符可以扩大,不可缩小
- 抛出异常不可扩大
- 返回值可以不同,但返回值类型必须相同
七,多态
多态的条件
- 子类继承父类
- 子类重写父类的方法
- 父类的引用指向子类的对象
在多态的情况下,父类的引用只能访问到父类成员,无法访问到子类的成员
向上转型:父类的引用指向子类对象
向下转型:将父类的对象转换为子类的对象
final
- final修饰的类不能被继承
- final修饰的方法不可被重写
- 修饰变量,变量不可被更改,只能被赋值一次
instanceof
- 判断引用是否真正指向内存空间是否为该类型
八,抽象
- abstract可以修饰类,构成抽象类
- abstract修饰方法,构成抽象方法
- 抽象方法中可以没有实现
- 子类继承抽象类,子类必须重写或继续使用abstract修饰
九,接口
interface
- 声明一个接口使用interface关键字
- 接口中有相应的属性和方法
- 接口中的属性是公共的静态常量
- 接口中的方法默认是公共的抽象方法
关系对比
类与类
- 继承,单继承
类与接口
- 实现,单实现,多实现
接口与接口
- 继承,单继承,多继承
接口中没有构造方法,接口的引用指向实现类的对象
十,内部类
分类
- 成员内部类
- 作为一个成员存在
- 不可以定义静态属性和方法
- 访问外部类
- 非静态属性,方法
外部类名.this.属性(方法)
,静态属性,方法外部类名.属性(方法)
- 外部类访问内部类
- 创建内部类对象进行访问
- 静态内部类
- static修饰成员内部类
- 可以定义静态属性和方法
- 访问外部类
- 静态属性,方法
外部类名.属性(方法)
- 外部类访问内部类
- 静态属性
内部类名.属性
- 非静态属性创建对象访问
- 局部内部类
- 在方法中定义的内部类
- 访问外部类
- 非静态属性,方法
外部类名.this.属性(方法)
,静态属性,方法外部类名.属性(方法)
- 外部类访问内部类
- 只能在方法内部访问
- 匿名内部类
十一,集合
- 集合与数组的区别
- 集合长度不固定,数组长度固定
- 只能存放引用类型,数组可存放引用类型,也可存放基本类型
- 集合继承体系
- Collection 单列集合
- List (有序,可重复)
- ArrayList
- 底层实现为数组
- 查询修改快
- 增删慢
- LinkedList
- 底层实现为链表
- 查询修改慢
- 增删快
- Vector
- 底层实现为数组
- 相比于ArrayList,Vector是线程安全的,但效率低于ArrayList
- Set (不可重复)
- 元素不重复的保证:先调用hashCode方法,hash值相同调用equals方法
- HashSet
- hashCode()方法: hash值相同,对象不一定相同,hash值不同,对象一定不同
- TreeSet
- TreeSet会将数据进行排序
- 自然排序(包装类实现了Comparable接口),对于自定义类也可以实现Comparable接口
- 比较器(Comparator)实现其中的compare方法,然后将比较器传入TreeSet的构造器
- Queue
- Map (k, v)双列集合
- Key值不可重复
- HashMap
- jdk1.8之前 数组+链表
- jdk1.8之后 数组+红黑树(阈值8)
- HashTable
- TreeMap
- 仅仅支持Key值排序
- LinkedHashMap(双向链表)
- 保证存取顺序一致
- 集合工具类
- java.util.Collections
十二,泛型
类型参数化
泛型类
例如:
class Person<T> {T age;String name; }
泛型相当于一个模板
实例化对象
类名<确定的类型> 变量 = new 类名<>();
泛型的类型必须最终确定
泛型接口
例如:
interface Test<T> {}
泛型方法
例如:
public <T> T test(T t) {}
通配符:?
十三,IO流
Java程序:流
体系:
- 字节输入/输出流
- 字节输入流
- read()读取一个字节,返回该字节
- read(byte[] b) 读取多个字节,返回读取到的字节数
- read(byte[] b, int off, int length)
- 字节输出流
- write(int b)
- write(byte[] b)
- write(byte[] b, int off, int length)
- 字符输入/输出流
- 字符输入流
- read()读取一个字符,返回字符编码值
- read(char[] c)读取多个字符,返回字符数
- read(char[] c, int off, int length)
- 字符输出流
- write(int c)
- write(char[] c)
- write(char[] c, int off, int length)
- 包装流(方便操作数据)
- 数据流
- 方便操作基本类型及String
- 构造器传入(InputStraem/OutputStream)
- DataInputStream/DataOutputStream
- 读写顺序保持一致
- 缓冲流
- 增加了一个缓冲区
- BufferedInputStream/BufferedOutputStream
- BufferedReader/BufferedWriter
- 转换流
- InputStreamReader/OutputStreamWriter
- 对象流
- 实现Serializable接口
- 操作Java对象
- 隐藏属性:transient关键字
- 序列版本号:serialVersionUID
- 随机访问流
- RandomAccessFile
- 单独的流
- 可以从文件中的任意位置开始访问文件
步骤:声明流 -> 创建流 -> 使用流 -> 关闭流
十四,线程
jvm线程调度策略属于抢占式调度
执行Java程序时,jvm会开辟一个main线程,对应于main方法
java.lang.Thread 是java中的线程类,所有的线程对象都必须是Thread类或其子类的实例
Java中通过继承Thread类来创建并启动一个新的线程的步骤如下:
- 定义 Thread 类的子类(可以是匿名内部类),并重写 Thread 类中的 run 方法, run 方法中的代码就是线程的执行任务
- 创建 Thread 子类的对象,这个对象就代表了一个要独立运行的新线程
- 调用线程对象的 start 方法来启动该线程
给一个线程对象指定要执行的任务,除了继承Thread类后重写run方法之外,还可以利用Runnable接口来完成线程任务的指定
java.lang.Runnable ,该接口中只有一个抽象方法 run,Thread属于Runnable的实现类
Java中,线程可以分为:
- 前台线程,又叫做执行线程、用户线程
- 后台线程,又叫做守护线程、精灵线程
线程优先级
- 优先级范围:1~10
- 高优先级有更高概率抢占资源
线程组
- Java中使用 java.lang.ThreadGroup 类来表示线程组,它可以对一批线程进行管理,对线程组进行操作,同时也会对线程组里面的这一批线程操作
线程状态
线程状态 名称 描述 NEW 新建 线程刚被创建,还没调用start方法,或者刚刚调用了start方法,调用start方法不一定"立即"改变线程状态,中间可能需要一些步骤才完成一个线程的启动。 RUNNABLE 可运行 start方法调用结束,线程由NEW变成RUNNABLE,线程存活着,并尝试抢占CPU资源,或者已经抢占到CPU资源正在运行,这俩种情况的状态都显示为RUNNABLE BLOCKED 锁阻塞 线程A和线程B都要执行方法test,而且方法test被加了锁,线程A先拿到了锁去执行test方法,线程B这时候需要等待线程A把锁释放。这时候线程B就是处理BLOCKED WAITING 无限期等待 一个线程在等待另一个线程执行一个(唤醒)动作时,该线程进入Waiting状态。进入这个状态后是不能自动唤醒的,必须等待另一个线程调用notify或者notifyAll方法才能够唤醒 TIMED_WAITING 有限期等待 和WAITING状态类似,但是有一个时间期限,时间到了,自己也会主动醒来 TERMINATED 终止(死亡) run方法执行结束的线程处于这种状态。
sleep方法
- 该方法可以使当前执行的线程暂时休眠指定毫秒数
join方法
- 可以让当前线程阻塞,等待另一个指定的线程运行结束后,当前线程才可继续运行
interrupt方法
- 该方法会打断阻塞状态,使对象抛出InterruptedException异常
线程同步
- Java中实现线程同步的方式,是给需要同步的代码进行 synchronized 关键字加锁。
- 产生线程安全问题的三要素
- 多线程
- 访问同一变量
- 写入操作
- synchronized 直接修饰一个方法,表示这个方法中的所有代码都需要线程同步,非静态方法锁对象为当前对象
wait和notify
- Object类中有三个方法: wait()、notify()、notifyAll()
- 当一个对象,在线程同步的代码中,充当锁对象的时候,在 synchronized 同步的代块中,就可以调用这个锁对象的这三个方法
- 三个核心点:
- 任何对象中都一定有这三个方法
- 只有对象作为锁对象的时候,才可以调用
- 只有在同步的代码块中,才可以调用
死锁问题
- 简单来说:线程t1和t2,t1拿着t2需要等待的锁不释放,而t2又拿着t1需要等待的锁不释放,俩个线程就这样一直僵持下去
- 在程序中要尽量避免出现死锁情况,一旦发生那么只能手动停止JVM的运行,然后查找并修改产生死锁的问题代码
十五,网络编程
- 客户端
- Socket(ip, port)
- getInputStream
- getOutputStream
- 服务器
- Socket = serverSocket(port).accept()
- URL/URI
- url 统一资源定位符
- uri 统一资源标识符
相关文章:
Java基础知识快速盘点(三)
一,构造器 创建一个类的方法时会调用该类的构造器 构造器,也叫构造方法 构造器是属于类的,对象不可调用 构造方法没有返回值类型 构造方法一般用public修饰,也可用private修饰,例如 public class Test {private T…...
vscode编程小插件之Doxygen和Better Align
一、插件Doxygen:配置相应文件、函数说明项。 1、扩展商店,搜索Doxygen,如下图1,安装。 图1 2、设置项中,选择扩展设置,如图2 图2 3、配置版本、作者邮箱、作者名称、日期格式等等,如图3 4、定义函数后&…...
指 针
1.指针指针的作用: 可以通过指针间接访问内存(可以通过指针的保存一个地址(指针--地址))内存编号是从0开始记录的,一般用十六进制数字表示。可以利用指针变量保存地址指针变量的定义和使用指针变是定义语法: 数据类型 …...
安卓小游戏:俄罗斯方块
安卓小游戏:俄罗斯方块 前言 最近用安卓自定义view写了下飞机大战、贪吃蛇、小板弹球三个游戏,还是比较简单的,这几天又把俄罗斯方块还原了一下,写了一天,又摸鱼调试了两天,逻辑不是很难,但是…...
NC113 验证IP地址
验证IP地址_牛客题霸_牛客网 描述 编写一个函数来验证输入的字符串是否是有效的 IPv4 或 IPv6 地址 IPv4 地址由十进制数和点来表示,每个地址包含4个十进制数,其范围为 0 - 255, 用(".")分割。比如,172.16.254.1&#…...
珠宝企业如何利用私域实现业绩增长?
近年来私域的流量不断兴起,各行业都在做私域,所处行业不同,企业所采取的私域打法也会针对性地改变。而在珠宝行业,针对珠宝产品高价、低频的消费特点,企业又该如何搭建私域应对策略? 快鲸scrm系统整理了几…...
回收站清空了还能找回来吗?回收站恢复的4个方法(最全)
回收站作为一个数据回收的地方,可以保存已删除的文件很久,直到用户手动永久删除这些数据,这为用户避免了许多数据丢失的问题。但是回收站数据过多,难免会影响电脑的运行速度。为此,我们都会定期进行清理。 清理过程中…...
深度解析React性能优化API
性能优化一直是前端领域讨论的一个热门问题,但在平时沟通及code review过程中发现很多人对于React中性能优化理解很模糊,讲不清楚组件什么时候更新,为什么会更新,关于React性能优化的文章虽然比较多,但大多数都是在罗列…...
算法刷题打卡第91天:统计一个圆中点的数目
统计一个圆中点的数目 难度:中等 给你一个数组 points ,其中 points[i] [xi, yi] ,表示第 i 个点在二维平面上的坐标。多个点可能会有 相同 的坐标。 同时给你一个数组 queries ,其中 queries[j] [xj, yj, rj] ,表…...
sentinel持久化方案
一.sentinel规则推送原理 1.原有内存规则存储原理 (1)dashborad中请求到服务器后,在controller中通过http把规则直接推送给client,client接收后把规则放入内存; 2.持久化推送规则原理 ![在这里插入代码片](https://img-blog.csdnimg.cn/1…...
软件项目进度安排与跟踪:关键路径的计算
在一个软件项目中,管理人员需要按时了解项目进度,制定项目计划,同时需要及时发现所遇到的问题,然后和团队成员制定解决方案,确保整个计划可以顺利的进行,因此项目进度安排与跟踪是项目管理中的一个重要环节…...
mac m2 处理器 iterm2 sz rz 出错/无限重试
mac m2 处理器 iterm2 sz rz 出错/无限重试 1、背景 apple m 系列处理器安装的 homebrew 跟 intel 处理器略有不同,其中安装目录的区别: m 系列处理器安装目录为 /usr/local/bin/homebrewintel 处理器安装目录为 /opt/homebrew 其中 m 系列处理器安装…...
Mysql 与 磁盘交互的过程
从之前的Mysql架构可以了解到,Mysql 客户端不是直接和磁盘打交道,我们在客户端输入的sql语句会被发送给服务端,服务端对sql语句进行解析、缓存等操作,然后再交由存储引擎去读写磁盘。这其实是从 C/S 的角度去了解Mysql。 站在OS的…...
Spring Cloud Gateway集成Nacos实现负载均衡
💡Nacas可以用于实现Spring Cloud Gateway中网关动态路由功能,也可以基于Nacos来实现对后端服务的负载均衡,前者利用Nacos配置中心功能,后者利用Nacos服务注册功能。接下来我们来看下Gateway集成Nacos实现负载均衡的架构图一. 环境…...
Excel图表教程_编程入门自学教程_菜鸟教程-免费教程分享
教程简介 Excel图表初学者教程 - 从简单和简单的步骤学习Excel图表从基本概念到高级概念,包括简介,创建图表,类型,柱形图,折线图,饼图,圆环图,条形图,面积图,…...
2023最新的接口自动化测试面试题
1、请结合你熟悉的项目,介绍一下你是怎么做测试的? -首先要自己熟悉项目,熟悉项目的需求、项目组织架构、项目研发接口等 -功能 接口 自动化 性能 是怎么处理的? -第一步: 进行需求分析,需求评审&#…...
AcWing语法基础课笔记 第一章 C++入门及简单的顺序结构
第一章 C入门及简单的顺序结构 编程是一种控制计算机的方式,和我们平时双击打开文件、关机、重启没有任何区别。 ———闫学灿 C中常用的变量类型 和所占字节大小 输出变量地址符: 软件环境 作业的评测与提交 在线练习地址:www.acwing.com …...
【并发编程】【2】进程与线程
并发编程 2.进程与线程 2.1 进程与线程 进程 程序由指令和数据组成,但这些指令要运行,数据要读写,就必须将指令加载至 CPU,数据加载至内存。在 指令运行过程中还需要用到磁盘、网络等设备。进程就是用来加载指令、管理内存、管…...
MySQL获取当前时间的各种方式
1 获取当前完整时间1.1 now()函数select now();输出:2023-02-15 10:46:171.2 sysdate()函数select sysdate();输出:2023-02-15 10:47:131.3 current_timestamp或current_timestamp()current_timestamp和current_timestamp()函数的效果是一样的,只不过一个是关键字&a…...
redis持久化之AOF(Append Only File)及其总结
1.是什么? 以日志的形式来记录每个写操作,将redis执行过的所有写指令记录下来(读操作不记录),只许追加文件但不可以改写文件,redis启动之初会读取该文件重新构建数据,换言之,redis重启的话就根据日志文件的…...
LeetCode 刷题之队列
5. 队列 队列(queue)是只允许在一端进行插入操作,而在另一端进行删除操作的线性表。 队列是一种先进先出的(First In First Out)的线性表,简称 FIFO。允许插入的一端为队尾,允许删除的一端为队…...
互联网摸鱼日报(2023-02-15)
互联网摸鱼日报(2023-02-15) InfoQ 热门话题 ChatGPT火爆全球后,OpenAI CEO称“它很酷,但却是个糟糕的产品” 微软发言人证实旗下LinkedIn平台开始裁员 Akamai 推出 Akamai Connected Cloud 和全新云计算服务 AI赋能元宇宙游戏…...
聊聊外包和远程项目的敏捷管理(合辑共7篇)
这是鼎叔的第五十一篇原创文章。行业大牛和刚毕业的小白,都可以进来聊聊。欢迎关注本专栏和微信公众号《敏捷测试转型》,大量原创思考文章陆续推出。第四个合辑完工了,咱们介绍了外包管理或远程项目如何敏捷交付,满足管理层预期。…...
2023-2-15 刷题情况
检查「好数组」 题目描述 给你一个正整数数组 nums,你需要从中任选一些子集,然后将子集中每一个数乘以一个 任意整数,并求出他们的和。 假如该和结果为 1,那么原数组就是一个「好数组」,则返回 True;否则…...
汉诺塔递归算法精讲
文章目录前言一、汉诺塔是个啥?二、手动解法三、解法抽象四、递归解法五、总结前言 递归算法是计算机算法中的基础算法,也是非常重要的算法,从某种程度上讲,它有一点儿AI的影子。人脑是可以完成递归思路的,但是对不起…...
vue的$nextTick的原理
参考:https://cloud.tencent.com/developer/article/1633546 总结一下:就是$nextTick将回调函数放到微任务或者宏任务当中以延迟它地执行顺序;(总结的也比较懒👶) 重要的是理解源码中它的三个参数的意思&a…...
前端学习第一阶段——第五章CSS(下)
5-9 浮动 08-浮动导读 09-传统网页布局三种方式 10-为什么需要浮动 11-什么是浮动 12-浮动特性-脱标 13-浮动特性-浮动元素一行显示 14-浮动特性-浮动元素具有行内块特性 15-浮动元素经常搭配标准流的父元素 16-浮动布局练习1 <!DOCTYPE html> <html lang"en&quo…...
基于django搭建简单的个人博客
文章目录第一步、在Ubuntu中安装虚拟环境并进入第二步、安装blog所需要的包,在requirements.txt中安装mysqlclient可能会报错,输入下列命令后在安装即可成功第三步、创建好数据库,把测试数据导入第四步、修改DjangoBlog包中 settings中数据库…...
JVM解释器与JIT编译器如何并存?
[1] JVM解释器 JVM设计的初衷仅仅只是为了满足Java程序实现跨平台特性,因此避免采用静态编译的方式直接生成本地机器指令,从而诞生了实现解释器在运行时采用逐行解释字节码的执行程序。 解释器真正意义上所承担的角色就是一个运行时“翻译者”࿰…...
生产者消费者模型
目录 一、生产者消费者模型的概念 二、生产者消费者模型的特点 三、生产者消费者模型优点 四、基于BlockingQueue的生产者消费者模型 4.1 基本认识 4.2 模拟实现 一、生产者消费者模型的概念 生产者消费者模式就是通过一个容器来解决生产者和消费者的强耦合问题 生产者和…...
跟换网站域名/seo需要付费吗
案例:使用百度搜索关键词“selenium 自学网” 并打开课程页面 from selenium import webdriver from time import sleep import unittest class Test_baidu(unittest.TestCase):def setUp(self):self.driverwebdriver.Firefox()self.driver.implicitly_wait(10)self…...
邢台网约车平台有哪些/百度搜索引擎优化公司哪家强
转载:http://www.cnblogs.com/CCGGAAG/p/7800323.html 上篇,我们说了如何配置基础的环境,配置好了python2、wxPython 、robot framework、robot framework-ride,这篇我们来根据已经配置好的环境来简单介绍一下RF(Robot…...
做网站高流量赚广告费/北京seo优化方案
概述 什么是分库分表 数据数量是不可控的,随着时间和业务发展,造成表里面数据越来越多,如果再去对数据库表CURD操作时,就会有性能问题。 解决方案 为了解决由于数据量过大而造成数据库性能降低问题,主要有下面两种…...
网站授权系统怎么用/重庆seo搜索引擎优化优与略
目录一、简介二、验证性实验1)ipconfig2)ping3)tracert4)ARP5)DHCP6)netstat7)DNS8)cache一、简介 本计算机网络实验教程由验证性、Wireshark 和 Cisco Packet Tracer 实验等三个部…...
游戏推广是干什么/谷歌seo
防火墙原是指建筑物大厦用来防止火灾蔓延的隔断墙。从理论上讲,Internet防火墙服务也属于类似的用来防止外界侵入的。它可以防止Internet上的各种危险(病毒、资源盗用等)传播到你的网络内部。而事实上,防火墙并不像现实生活中的防…...
西安关键词seo公司/北京外贸网站优化
本节书摘来自异步社区《Adobe After Effects CS6中文版经典教程》一书中的第1课,第1.7节,作者 【美】Adobe公司 ,译者 张明,更多章节内容可以访问云栖社区“异步社区”公众号查看。 1.7 After Effects性能优化 对After Effects的…...