该文章只是个人学习总结 可能存在不正确的知识点 欢迎大家指点
认识JVM/JVR/JDK
JVM(java virtual machine)
JVM是java虚拟机 因为要将java运行在多个多个平台 所以需要虚拟机运行java 保证多个平台 运行效果是一样的
Java程序的执行过程
源代码文件(*.java)通过编译器(compiler)编译成字节码文件(*.class)然后给解释器(interperter)解释成机器语言给JVM执行
(这里有过程图)
JRE(java Runtime Environment)
- 包含java虚拟机/java核心类库和支持文件
- 运行java程序 只要有JRE就可以
JDK(java Development Kit)
- 运行java软件 就用JDK
- JDK附带JRE
java语言的软件开发工具包
两个主要组件:
- javac - 编译器, 将源代码转成字节码
- java 运行编译后的java程序(.class后缀)
JDE是面向开发程序
JDK是面向开发者
JVM/JRE/JDK的关系
JDK包含JRE JRE包含JDK
Java平台
- javaSE
- 标准版
- 桌面程序
- 基于JDK和JRE
- javaEE
- 企业版
- WEB程序
- javaME
- 微型版
- 移动版
第一个程序
1 创建java后缀的文件
// HelloWorld.java
public class HelloWorld {
public static void main(String[] args){
System.out.prinlnt("hello world");
}
}
2 编译java文件
# 在刚刚文件的同级目录中使用 javac 对java文件进行编译
# 如果提示javac工具不存在 就要在系统的环境变量中进行配置
$ javac HelloWorld.java
编译成功后 会生成一个HelloWord.class的文件
3 运行编译后的文件
# 使用java运行刚刚编译出来的文件(不加后缀默认是运行*.class)
$ java HelloWord
此时命令行中 就会显示刚刚java文件中执行结果
System.out.prinln() 是将字符串打印到命令行的语句
>>> hello world
数据类型
double类型赋值可以最后面可以带有d或者不带d
double num1 = 3.14;
double num1 = 3.14d;
float类型赋值最后面必须带有f
float num1 = 3.14f;
数据类型转换
隐形类型转换(自动类型转换)
实线 转换的时候不会精度丢失
虚线 转换的时候可能会精度丢失
猜测:int转char 中 范围在0-128 之间用ascll编码 大于这个范围 用unicode编码
强制类型转换
强制类型转换就是上面的图 逆着转换时就要使用强制类型转换
格式: (数据类型)数值
double doubleNum = 3.14;
float floatNum = (double)doubleNum;
数据类型详解
| 数据类型 | 字节大小 | 说明 |
|---|---|---|
| byte | 1 | 字节型 |
| short | 2 | 短整型 |
| int | 4 | 整型 |
| long | 8 | 长整型 |
| float | 4 | 单精度浮点型 |
| double | 8 | 双精度浮点型 |
| char | 2 | 字符型 |
| boolean | 1 | 布尔型 |
字面量声明
二进制 0b/0B 开头
八进制 0开头
十六进制 0x/0X 开头
// 二进制
int intNum1 = 0b01;
int intNum2 = 0B01;
// 八进制
int intNum3 = 07;
// 十六进制
int intNum4 = 0x1ad;
基本数据类型变量的存储
作用范围
- 类级
- 对象实例级
- 方法级→ 局部变量
- 块级
基本数据类型存在栈中
引用数据类型 是把引用存在栈中 实际数据存在堆中
常量
使用final关键字用于定义常量
- 常量定义后就无法改变
- 初始化时就要赋值
- 规范是使用
全大写 多个单词就用下划线连接
final int COUNT = 30;
final int NEW_COUNT = 40;
数值类型的应用场景
整型的应用场景
int和long是常用的数据类型, byte和short使用的比较少, 即使数值比较小也是会使用int
byte类型主要是用于存储二进制数据, 文件的输入输出流会用到, 用于二进制数据的传输
short类型在有些需求会用到 比例登录状态 0 表示正常 1表示冻结 2表示删除, 数值比较固定, 值也比较小
浮点型的应用场景
浮点型有float和double
按照表示的范围用于选择, 使用double比较多
由于浮点型表示方式的原因, 会产生精度丢失, 所以会结合
BigDecimal类使用
double a = 1.0;
double b = 2.0;
// 这里的Dobule是double关键字的包装类
BigDecimal b1 = new BigDecimal(Dobule.toString(a));
BigDecimal b2 = new BigDecimal(Dobule.toString(b));
// subtract() 方法 是对两个BigDecimal完成减法计算
// doubleValue() 方法 是将BigDecimla转换成double类型的数值
double c = b1.subtract(b2).duobleValue();
// add() 方法 是对两个BigDecimal完成加法计算
double d = b1.add(b2).duobleValue();
// 更多关于BigDecimal类方法请查看官方文档
运算符
- 算数运算符
- 逻辑运算符
- 赋值运算符
- 关系运算符
- 判断运算符
- 位运算符
赋值运算符
= 等号就是赋值运算符
算数运算符
| 运算符 | 作用 |
|---|---|
| + | 加 |
| - | 减 |
| * | 乘 |
| / | 除 |
| % | 取余 |
组合赋值运算符
| 运算符 | 作用 |
|---|---|
| += | 先加后赋值 |
| -= | 减后赋值 |
| *= | 先乘后赋值 |
| /= | 先除后赋值 |
| %= | 先取余后赋值 |
逻辑运算符
| 运算符 | 作用 |
|---|---|
| \ | 或 |
| || | 或 |
| & | 与 |
| && | 与 |
| ! | 非 (取反) |
逻辑中断 当前面逻辑得出的结果 是可以使整个式子不成立 那么逻辑运算符后面的也不会执行
|和|| 的区别
前者不会有逻辑中断 即使左侧已经运行结束 右侧也会继续运行
后者有逻辑中断 左侧运行结束 如果已经使整个式子不成立 右侧也不会执行
& 和 && 同理
关系运算符
| 运算符 | 作用 |
|---|---|
| == | 等于 |
| 大于 | |
| ≥ | 大于等于 |
| < | 小于 |
| ≤ | 小于等于 |
判断运算符
条件 ? 条件为真的处理 : 条件为假的处理
int count = 10
// 如果count是10 那么就会给flag赋值为true 反之
boolean flag = count == 10 ? true : false;
自增自减运算符
++ / —
int count = 10;
System.out.println(count++); // >>> 10
count = 10;
System.out.println(++count); // >>> 11
count = 10;
System.out.println(count--); // >>> 10
count = 10;
System.out.println(--count); // >>> 9
自增自减去运算符在数值的后方 会先执行完当前语句在+1或者-1
而在前方 就会先对值+1或者-1
运算符的优先级
- 括号
- 自增/自减运算符
- 算数运算符
- 关系运算符
- 逻辑运算符
- 赋值运算符/复合赋值运算符