### 标识符
规则:字母、数字、`_`、`$`;**不能以数字开头,不能是关键字,区分大小写**
命名规范:
- 类名:大驼峰 `HelloWorld`
- 变量 / 方法:小驼峰 `studentName`
- 常量:全大写,下划线分隔 `MAX_VALUE`
>
> ❗易错:`1name` 非法;`$name` 语法允许但不推荐;`class`、`static` 是关键字不能用作变量名
### 2. 数据类型
Java 是**强类型语言**,变量必须声明类型。分为**基本类型(8 个)** 和**引用类型**
#### 基本数据类型
表格
| 类型 | 字节 | 取值 | 默认值 |
| --- | --- | --- | --- |
| byte | 1 | -128 ~ 127 | 0 |
| short | 2 | -32768 ~ 32767 | 0 |
| int | 4 | 常用整型 | 0 |
| long | 8 | 长整型,字面量加`L/l` | 0L |
| float | 4 | 单精度,字面量加`F/f` | 0.0F |
| double | 8 | 双精度(小数默认 double) | 0.0 |
| char | 2 | 0~65535,存 Unicode | `\u0000` |
| boolean | 1 | true/false | false |
>
> ❗易错点
>
>
> 1. `long num = 10000000000;` 报错!整数字面量默认 int,超大数字必须写`10000000000L`
> 2. `float f = 3.14;` 报错!小数默认 double,必须写`3.14F`
> 3. `char c = 'ab';` 错误,char 只能存**单个字符**,单引号;双引号是 String(引用类型)
> 4. boolean**不能和数字转换**,不存在 0=false、非 0=true(C 语言习惯坑)
> 5. 浮点数不要直接用`==`比较!精度丢失 `0.1+0.2 != 0.3`
#### 引用类型
类、接口、数组、String。默认值:`null`
>
> 基本类型存**值**在栈;引用类型栈存地址,对象本体在堆。
### 3. 类型转换
1. 自动转换(小→大):`byte→short→int→long→float→double`
2. 强制转换(大→小):`int a = (int)3.9;` 直接截断小数,**不是四舍五入**
>
> ❗易错
>
>
> - 强制转型可能溢出:`byte b = (byte)130;` 结果是 -126
> - `short s = 1; s = s + 1;` 编译报错:`s+1`自动提升为 int,需要强转 `s = (short)(s+1)`;`s+=1` 自带强制转换不会报错!
### 4. 运算符
- `++ / --`:前置先自增,后置先取值
```
int a=2;
int b = a++; // b=2,a=3
int c = ++a; // c=4,a=4
```
>
> ❗易错:`i = i++;` 结果 i 不变(面试经典坑)
- `&&` 短路与,`||`短路或:前面能确定结果,后面代码**不执行**
```
int x=2;
false && (++x>0); // ++x不会执行,x还是2
```
>
> `&`和`|`不短路,两边都会执行
- `==`:
- 基本类型:比较**值**
- 引用类型:比较**地址**,不是内容!
>
> String 比较内容必须用 `.equals()`
## 二、流程控制
### 1. if-else
>
> ❗易错:`if(a=5)` 编译报错!Java 中 if 条件必须 boolean,不能写赋值(C 语言坑)
### 2. switch
支持:`byte,short,int,char`,Java5 + 支持枚举,Java7 + 支持 String
>
> ❗易错
>
>
> - 不加`break`会**穿透**,继续执行后面 case
> - case 后面只能是常量,不能写变量;default 可以放任意位置,但建议写最后
### 3. 循环 for /while/do-while
- do-while:**至少执行 1 次**
>
> ❗易错:
>
>
> 1. for 循环定义在 () 内的变量,循环结束就失效
> 2. 死循环:`while(true)`;注意`;` 陷阱 `while(true);{}` 分号代表循环体为空
> 3. `break`跳出当前循环;`continue`跳过本次循环剩余代码,进入下一次