🏗️ Java 技术栈#
- 程序基础
- 面向对象
- 数组
- 异常机制
- 常用 API
- 集合 + Map
- IO 流
- 多线程
- 网络编程
- 正则表达式
- lambda 表达式 + 函数式接口
- 反射机制
- GUI
📌 Java 方向#
- JavaSE
- JavaME
- JavaWEB
- JavaEE
🔰 Java 特性#
- 多线程
- 跨平台
- 面向对象
- 自动垃圾回收
Java 属于静态强类型解释性语言
静态类型 创建变量时指定数据类型
动态类型 创建变量时无需指定数据类型 运行后赋值时确定数据类型
强类型 需通过强制转换类型 转换类型
弱类型 根据程序上下文环境自动修改数据类型
编译型 使用编译器来编译执行的编程语言
解释型 使用解释器来解释执行的编程语言
xxx.java ----->xxx.class ----->Hello World
Windows/Linux/MacOS
- 运行:运行时 JVM 开机,将所运行的类载入内存空间中的静态区
- 加载完成后,JVM 会自动调用该类的 main 方法 (只要是方法调用,就会在栈内存中开辟栈帧并压栈)
- 如果 main 方法中,有别的方法调用
- 如果调用的是其他类中的方法,则先把对应类加载到静态区,然后再栈内存中开辟栈帧
- 如果调用的是当前类中的方法,则直接在栈内存开辟栈帧
- 如果被调用的方法中,还有其他方法调用,则继续开辟栈压栈,一直到栈顶元素,执行完成弹栈 返回上一个栈继续执行
- 直到main 栈帧弹栈,则整个程序生命周期终止
💾 结构#
内存存储#
电子位 bit 八位 一字节
最高位为符号位
内存划分#
静态区 / 方法区#
保存静态资源文件 例如静态变量 方法 运行时的 class 文件等
VM 栈#
以栈数据结构为模型创建的一块空间
主要用于执行方法
结构特征 先进后出
- 栈顶元素 最后放进去的元素
- 栈底元素 第一个放进去的元素
- 栈帧 栈数据结构中的元素
压栈 把栈帧放到栈空间的过程
弹栈 把栈帧在栈空间弹出去的过程
每当调用一个方法的时候,该方法就会在栈内存中开辟一个栈,并压栈到栈空间。开始执行,方法执行完后 弹栈 栈销毁
堆内存#
保存类对象和成员变量及成员方法
🧾 数据类型#
基本数据类型#
- 数值型
- 整数型
- byte 8bit
- short 16bit
- int 32bit
- long 64bit
- 浮点型
- float 32bit
- double 64bit
- 整数型
- 布尔型 boolean
- 字符型 char
注意 ⚠️
- byte
取值127
~-128
- short
取值32767
~-32768
- int
取值2147483647
~-2147483648
- long
需要以L
或l
结尾 - float
需要以F
或f
结尾
由于 float 采用科学计数法进行存储 float 的 32 位存储量远大于long 的 64 位 - double
需要以D
或d
结尾 或不写 - boolean
只有true
和false
- char
使用单引号表示 并且有且只有一个字符
char 范围0
~65535
不需要负数
支持 Unicode 编码 4bit 十六进制整型值 0~f\u0000
~\uffff
引用数据类型#
- 类
- 数组
- 接口
字符串#
\
转义符
+
字符串拼接符
💱 类型转换#
布尔型 不能参与转换
- 低精度到高精度 可以自动类型转换
- 高精度 到低精度 需要强制类型转换
自动类型转换#
byte --> short --> int --> long --> float --> double
char --> int --> long --> float --> double
强制类型转换#
多出的高位部分被截断 有可能损失精度
整数转换为 char 时 当不考虑符号位时 对应的是 65271
整数转换为 char 时 忽略负数 将响应负数的二进制转换为对应的正数 然后再进行 ASCII 码对照
多类型混合运算#
当进行多类型混合运算时 结果为参与运算的最大类型
当混合运算类型只出现了 byte short int char 四种类型时
任意一种或多种进行运算,结果一定是 int 类型 (可以理解为混合运算的结果为参与运算的最大类型,但最低也是 int 类型)
💬 注释#
单行注释
// XXX
多行注释
/*
* XXX
* YYY
*/
/**
* XXX
* YYY
*/
可生成 Javadoc 文档
📛 命名#
强制规则 只允许使用大小写字母、$
、_
、数字(数字不能开头)不能使用关键字和保留字
非强制规则 驼峰命名 见名之意
💩 变量#
全局变量#
全局变量一般是指可以直接调用,不需要二次引用的变量
Java 中不存在全局变量
变量声明#
使用数据类型划分内存空间 给空间取名,并赋值
变量分类#
分为四类
- 局部变量 在方法中写的变量
无初始值 需初始化 - 静态变量 在类体中 被
static
修饰的变量 - 成员变量 在类体中 没有被
static
修饰的变量 存放在堆内存中 - 常量
同时被static
和final
修饰的变量
默认值#
- 整数
0
- 小数
0.0
- 字符
\u0000
- 布尔
false
- 引用
null
作用域#
静态变量调用 使用类名。静态变量名 需要考虑权限修饰符
区分#
使用类名区分同名的局部变量和静态变量
使用 this
区分同名的局部变量和成员变量
优先级#
局部变量可以和静态变量 / 成员变量可同名
静态变量和成员变量 不可同名
📐 运算符#
算术运算符#
关系运算符#
>
>=
<
<=
==
!=
结果是布尔型
==
基本类型比较数值 引用类型比较内存地址
逻辑运算符#
&
&&
与
支持与运算 两边是数字 即可进行与运算
两个数转换为二进制进行每位比较 同 1 取 1 反之取 0 结果不大于两个数中的最小数|
||
或!
非^
异或 两边不一致为真
两边是数字进行异或运算 每二进制位进行比较 不同取 1 相同取 0>>
右移运算
右移一次 就相当于该数除 2 (符号位不变)>>>
不考虑符号位 并且不考虑正负数 只在最左边补0
负数有可能变正数<<
左移运算
向左移动一位 删除左边 (非符号位) 右边补0
相当于该数乘 2
赋值运算符#
+=
-=
*=
/=
%=
计算过程中自动进行强制类型转换
赋值运算属于右结合,同优先级从右到左计算
int result = x = y = z = 10;
由于=
的右结合性,先执行 z = 10
; 再执行 y = z
再执行 x = y
运算
三目运算符#
xxx?yyy:zzz
xxx
需要判断的语句 布尔型yyy
判断为真时执行的语句zzz
判断为假时执行的语句