基础
Java 编译基本流程
- 硬盘上创建了一个文件 Test.java
- 文件中的内容是我们编写的源代码(跟计算机发送指令)
// Test.java
public class Test {
public static void main(String[] args) {
byte x;
x = 1;
}
}
- 执行
javac Test.java
将 Test.java 源文件 -----> 编译 -------> Test.class(字节码文件,留给计算机识别) - 执行
java Test
,类加载器将 Test.class 中的类加载到内存中,然后运行 Test 类,执行main
主方法 main
方法入栈,发现声明了常量x
,从常量缓冲区复制1
到 栈 里
环境搭建
JDK(Java开发工具包) 包含 JRE(Java运行时)和 JVM(Java虚拟机)
- 安装 JDK(JRE JVM)
- 配置环境变量
bin/
- 编写
.java
源代码,使用javac
命令编译源代码
class Hello {
public static void main(String[] args) {
System.out.printLn("Hello World.");
}
}
- 编译完成后得到
.class
字节码文件,使用java
命令执行字节码文件
Java 数据类型
八大基本数据类型
整型
byte
short
int
long
浮点型
float
double
字符型
char
布尔型
boolean
基本数据类型内存容量
byte
字节型:8 个 bit 敏感单元位- 1byte == 8bit
- 256种组合
- 用第一个 bit 位置来记录符号 0正数 1负数
- 取值范围 -2的7次方 ~ 2的七次方-1,即 -128 ~ 127
short
短整型:2 个 byte,16 个 bit- 65536 种组合
- 取值范围 -32768 ~ 32767
int
整形:4 个 byte,32 个 bit- 取值范围 -2147483648 ~ 2147483647
long
长整型:8 个 byte,64 个 bit- 取值范围 -2的64次方 ~ 2的64的次方-1
float
单精度浮点型:4 个 byte,32 个 bitdouble
双精度浮点型:8 个 byte,64 个 bitchar
字符型:2 个 byte,16 个 bit- 用单引号 ' ' 表示,英文字符占一个字节,中文占两个字节
- Unicode 编码
boolean
布尔型:1 个 byte,8 个 bit- true false
引用数据类型
数组
[]
类
class
(抽象类abstract class
)接口
interface
枚举
enum
注解
@interface
类型转换
基本类型 🔁 基本类型
小数据类型相同
都是整型或都是浮点
- 大空间变量可以直接存储空间变量的数据
- 小空间变量不可以直接存储大空间的数据(需要强制类型转换)
- 强制转换写法都可以通过编译,但如果转换的过程中数值范围超过边界,就可能会有损失
byte a = 1; int b = a; // 小空间变量放入大空间变量,不需要手动转换
int a = 1; byte b = (byte)a; // 大空间转空间,需要强制转换
float x = 3.4F; double y = x; // 无需手动转换
double x = 3.4; float y = (float)x; // 需要手动强制转换
int a = 1000; byte b = (byte)a; // 编译通过,但最终 b 的值会发生改变,因为 int1000 转到 byte 只会保留最后 8 个 bit 位
小数据类型不同
整型 转 浮点型
- 比较精确程度 浮点型精确度更高,可以直接存放整数,反之则需要强制转换
- 任何一个浮点型(float/double)都可以直接存放一个整型
int a = 1; float b = a; // 无需手动转换
float a = 1.0F; int b = (int)a; // 需要手动强制类型转换,转换后舍弃小数点后的部分
整形 转 字符型
- 每一个字符都对应着一个 Unicode 码,例如:a -- 97
- 字符可以直接转整形,整形转字符则需要强制转换,因为整形是 32bit,而字符是 16bit
char x = 'a'; int y = x; // 无需手动转换,结果 y == 97
int x = 97; char y = (int)x; // 需要强制转换,将 32bit 的 x 放入 16bit 的 y
布尔类型很特殊
布尔类型不能与其他基本类型之间发生转换
运算符
运算符是用来指明对于操作值的运算方式
按照操作值的数目进行分类
- 单目
a ++;
- 双目
a + b;
- 三目
(a > b) ? x : y;
按照运算符的功能进行分类
算术运算
+
加-
减*
乘/
除%
取余、取模++
自增,++
在前,先计算再赋值;++
在后先赋值再计算--
自减,--
在前,先计算再赋值;--
在后先赋值再计算
赋值运算
=
将=
右边的值存入=
左边的变量空间内+=
复合赋值,n = n + 1
等价于n += 1
,以下复合符号同理-=
*=
/=
%=
关系运算(比较)
>
大于>=
大于等于<
小于<=
小于等于!=
不等于==
等于instanceof
验证一个对象是否是一个类的实例
逻辑运算
&
逻辑与:左右全部满足时返回true|
逻辑或:左右有一个条件满足时返回true^
逻辑异或:只在左右结果不同时返回true!
逻辑非:单目,反转结果&&
短路与:左边条件不满足时,直接返回false,不再计算右边结果||
短路或:左边条件满足时,直接返回true,不再计算右边结果
位(bit)运算
&
按位与|
按位或^
按位异或~
按位取反<<
按位左位移>>
按位右位移>>>
按位右位移(无符号)
字符 char 和 字符串 String 的区别
char
字符类型,基本类型,有且只能有一个字符
String
字符串,引用类型,不受限制
字符 | 字符串 |
---|---|
char | String |
基本类型 | 引用类型 |
'a' | "a" "abc" "" |