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.持久化推送规则原理 
软件项目进度安排与跟踪:关键路径的计算
在一个软件项目中,管理人员需要按时了解项目进度,制定项目计划,同时需要及时发现所遇到的问题,然后和团队成员制定解决方案,确保整个计划可以顺利的进行,因此项目进度安排与跟踪是项目管理中的一个重要环节…...
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重启的话就根据日志文件的…...

JavaSec-RCE
简介 RCE(Remote Code Execution),可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景:Groovy代码注入 Groovy是一种基于JVM的动态语言,语法简洁,支持闭包、动态类型和Java互操作性,…...
椭圆曲线密码学(ECC)
一、ECC算法概述 椭圆曲线密码学(Elliptic Curve Cryptography)是基于椭圆曲线数学理论的公钥密码系统,由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA,ECC在相同安全强度下密钥更短(256位ECC ≈ 3072位RSA…...
基于matlab策略迭代和值迭代法的动态规划
经典的基于策略迭代和值迭代法的动态规划matlab代码,实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...

Kafka入门-生产者
生产者 生产者发送流程: 延迟时间为0ms时,也就意味着每当有数据就会直接发送 异步发送API 异步发送和同步发送的不同在于:异步发送不需要等待结果,同步发送必须等待结果才能进行下一步发送。 普通异步发送 首先导入所需的k…...
掌握 HTTP 请求:理解 cURL GET 语法
cURL 是一个强大的命令行工具,用于发送 HTTP 请求和与 Web 服务器交互。在 Web 开发和测试中,cURL 经常用于发送 GET 请求来获取服务器资源。本文将详细介绍 cURL GET 请求的语法和使用方法。 一、cURL 基本概念 cURL 是 "Client URL" 的缩写…...
华为OD最新机试真题-数组组成的最小数字-OD统一考试(B卷)
题目描述 给定一个整型数组,请从该数组中选择3个元素 组成最小数字并输出 (如果数组长度小于3,则选择数组中所有元素来组成最小数字)。 输入描述 行用半角逗号分割的字符串记录的整型数组,0<数组长度<= 100,0<整数的取值范围<= 10000。 输出描述 由3个元素组成…...
在golang中如何将已安装的依赖降级处理,比如:将 go-ansible/v2@v2.2.0 更换为 go-ansible/@v1.1.7
在 Go 项目中降级 go-ansible 从 v2.2.0 到 v1.1.7 具体步骤: 第一步: 修改 go.mod 文件 // 原 v2 版本声明 require github.com/apenella/go-ansible/v2 v2.2.0 替换为: // 改为 v…...
TCP/IP 网络编程 | 服务端 客户端的封装
设计模式 文章目录 设计模式一、socket.h 接口(interface)二、socket.cpp 实现(implementation)三、server.cpp 使用封装(main 函数)四、client.cpp 使用封装(main 函数)五、退出方法…...

数据挖掘是什么?数据挖掘技术有哪些?
目录 一、数据挖掘是什么 二、常见的数据挖掘技术 1. 关联规则挖掘 2. 分类算法 3. 聚类分析 4. 回归分析 三、数据挖掘的应用领域 1. 商业领域 2. 医疗领域 3. 金融领域 4. 其他领域 四、数据挖掘面临的挑战和未来趋势 1. 面临的挑战 2. 未来趋势 五、总结 数据…...
Qt学习及使用_第1部分_认识Qt---Qt开发基本流程
前言 学以致用,通过QT框架的学习,一边实践,一边探索编程的方方面面. 参考书:<Qt 6 C开发指南>(以下称"本书") 标识说明:概念用粗体倾斜.重点内容用(加粗黑体)---重点内容(红字)---重点内容(加粗红字), 本书原话内容用深蓝色标识,比较重要的内容用加粗倾…...