|
|
@@ -194,6 +194,126 @@ String name = "张三";
|
|
|
System.out.println("我叫:" + name);
|
|
|
```
|
|
|
|
|
|
+### 5. 基本数据类型转换
|
|
|
+
|
|
|
+> 数值类型(除 `boolean` 外)之间可以相互转换,分为**自动转换**和**强制转换**两种。
|
|
|
+
|
|
|
+#### 自动转换(隐式转换 / Widening)
|
|
|
+
|
|
|
+把表示范围**小**的类型的变量,直接赋值给表示范围**大**的类型的变量,可以自动完成。
|
|
|
+
|
|
|
+**转换方向**(箭头方向为自动转换方向):
|
|
|
+
|
|
|
+```
|
|
|
+byte → short → int → long → float → double
|
|
|
+```
|
|
|
+
|
|
|
+> 就像把一瓶 500ml 的水倒进一个 1L 的瓶子里,完全装得下。
|
|
|
+
|
|
|
+```java
|
|
|
+byte a = 120;
|
|
|
+short b = a; // byte → short(自动)
|
|
|
+int c = b; // short → int(自动)
|
|
|
+long d = c; // int → long(自动)
|
|
|
+float f = d; // long → float(自动)
|
|
|
+double dd = f; // float → double(自动)
|
|
|
+```
|
|
|
+
|
|
|
+#### 强制转换(显式转换 / Narrowing)
|
|
|
+
|
|
|
+把表示范围**大**的类型的值,赋值给表示范围**小**的类型的变量,需要使用**强制转换运算符**。
|
|
|
+
|
|
|
+**语法格式:**
|
|
|
+
|
|
|
+```java
|
|
|
+目标类型 变量名2 = (目标类型) 变量1;
|
|
|
+```
|
|
|
+
|
|
|
+> 强制转换可能丢失精度,分两种情况:
|
|
|
+> - 能装得下:1L 瓶里有 300ml 水 → 倒进 500ml 的瓶子 ✅
|
|
|
+> - 装不下:1L 瓶里有 600ml 水 → 倒进 500ml 的瓶子 ❌(数据溢出)
|
|
|
+
|
|
|
+```java
|
|
|
+// 示例 1:double → int(小数截断,不是四舍五入)
|
|
|
+double pi = 3.94;
|
|
|
+int n = (int) pi; // n 的值是 3,丢失了小数部分
|
|
|
+System.out.println(n);
|
|
|
+
|
|
|
+// 示例 2:int → byte(数据溢出)
|
|
|
+int n2 = 128;
|
|
|
+byte b2 = (byte) n2; // byte 最大值是 127,128 会溢出
|
|
|
+System.out.println(b2); // 输出 -128
|
|
|
+```
|
|
|
+
|
|
|
+**int 128 → byte 的转换过程:**
|
|
|
+
|
|
|
+```
|
|
|
+1. int 的 128(十进制)→ 32 位二进制:
|
|
|
+ 0000 0000 0000 0000 0000 0000 1000 0000
|
|
|
+
|
|
|
+2. 转换为 byte(8 位),直接砍掉高位(左边 24 位):
|
|
|
+ 1000 0000
|
|
|
+
|
|
|
+3. 二进制中,最左边是符号位:
|
|
|
+ 0 → 正数,1 → 负数
|
|
|
+ 所以 1000 0000 对应十进制 -128
|
|
|
+```
|
|
|
+
|
|
|
+### 6. 表达式提升与编码表
|
|
|
+
|
|
|
+#### 表达式提升
|
|
|
+
|
|
|
+`byte`、`short`、`char` 参与算术运算时,会自动提升为 `int` 类型。
|
|
|
+
|
|
|
+```java
|
|
|
+byte a = 15;
|
|
|
+short b = 20;
|
|
|
+
|
|
|
+// byte c1 = a + b; // ❌ 编译错误:a + b 结果是 int
|
|
|
+// short c2 = a + b; // ❌ 编译错误:a + b 结果是 int
|
|
|
+int c3 = a + b; // ✅ 正确
|
|
|
+```
|
|
|
+
|
|
|
+#### 整数除法截断
|
|
|
+
|
|
|
+两个整数相除,结果直接截断小数部分,**不会四舍五入**。
|
|
|
+
|
|
|
+```java
|
|
|
+System.out.println(10 / 3); // 输出 3(截断小数)
|
|
|
+System.out.println(10 / 3.0); // 输出 3.3333333333333335(浮点数除法)
|
|
|
+```
|
|
|
+
|
|
|
+#### char 与 int 的关系
|
|
|
+
|
|
|
+`char` 本质上是数值类型,可以与 `int` 相互转换:
|
|
|
+
|
|
|
+```java
|
|
|
+char cc = 'A';
|
|
|
+int d1 = cc + 6; // 'A' 的 ASCII 码是 65,65 + 6 = 71
|
|
|
+System.out.println(d1); // 输出 71
|
|
|
+
|
|
|
+char c6 = 97; // 直接为 char 赋整数值
|
|
|
+System.out.println(c6); // 输出 'a'(97 对应 ASCII 表的 'a')
|
|
|
+```
|
|
|
+
|
|
|
+> Java 中 8 种基本数据类型除了 `boolean`,其余 7 种都属于**数值类型**,都可以转换为数字。
|
|
|
+
|
|
|
+#### 编码与解码
|
|
|
+
|
|
|
+| 概念 | 方向 | 说明 |
|
|
|
+|------|------|------|
|
|
|
+| **编码** | 字符 → 二进制数 | 把人类可读的字符转换为计算机能识别的二进制 |
|
|
|
+| **解码** | 二进制数 → 字符 | 把二进制转换回人类可读的字符 |
|
|
|
+
|
|
|
+#### 常见编码表(字符集)
|
|
|
+
|
|
|
+| 编码表 | 说明 |
|
|
|
+|--------|------|
|
|
|
+| **ASCII** | 美国标准信息交换码,使用 1 字节(7 位实际有效),共 128 个字符 |
|
|
|
+| **GB-2312 / GBK** | 中国国家标准简体中文字符集 |
|
|
|
+| **Unicode** | 通用字符编码标准,使用 2 字节,可表示 65536 个字符 |
|
|
|
+| **UTF-8** | Unicode 的一种变长编码实现,互联网最常用的字符集(中国大陆常用编码) |
|
|
|
+
|
|
|
---
|
|
|
|
|
|
## 五、输出语句
|
|
|
@@ -353,6 +473,87 @@ public class Demo04 {
|
|
|
}
|
|
|
```
|
|
|
|
|
|
+### Demo05.java — 基本数据类型转换
|
|
|
+
|
|
|
+```java
|
|
|
+/**
|
|
|
+ * @author WanJl
|
|
|
+ * @version 1.0
|
|
|
+ * @title Demo05
|
|
|
+ * @description 基本数据类型的转换
|
|
|
+ * @create 2026/7/13
|
|
|
+ */
|
|
|
+public class Demo05 {
|
|
|
+ public static void main(String[] args) {
|
|
|
+ // ========== 自动转换 ==========
|
|
|
+ // 小范围 → 大范围,自动完成
|
|
|
+ byte a = 120;
|
|
|
+ short b = a; // byte → short
|
|
|
+ int c = b; // short → int
|
|
|
+ long d = c; // int → long
|
|
|
+ float f = d; // long → float
|
|
|
+ double dd = f; // float → double
|
|
|
+
|
|
|
+ // ========== 强制转换 ==========
|
|
|
+ // 大范围 → 小范围,需要强制转换运算符,可能丢失精度
|
|
|
+
|
|
|
+ // 示例 1:double → int(小数截断)
|
|
|
+ double pi = 3.94;
|
|
|
+ int n = (int) pi; // double → int
|
|
|
+ System.out.println(n); // 3(直接截断小数,不是四舍五入)
|
|
|
+
|
|
|
+ // 示例 2:int → byte(数据溢出)
|
|
|
+ int n2 = 128;
|
|
|
+ byte b2 = (byte) n2; // int → byte,byte 最大值 127
|
|
|
+ System.out.println(b2); // -128(溢出导致)
|
|
|
+ /*
|
|
|
+ 转换过程:
|
|
|
+ 1. int 128 → 32位二进制:
|
|
|
+ 0000 0000 0000 0000 0000 0000 1000 0000
|
|
|
+ 2. 截取低8位 → byte:
|
|
|
+ 1000 0000(最左边是符号位,1 表示负数)
|
|
|
+ 3. 1000 0000 二进制 → 十进制 -128
|
|
|
+ */
|
|
|
+ }
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+### Demo06.java — 表达式提升与编码表
|
|
|
+
|
|
|
+```java
|
|
|
+/**
|
|
|
+ * @author WanJl
|
|
|
+ * @version 1.0
|
|
|
+ * @title Demo06
|
|
|
+ * @description 表达式提升
|
|
|
+ * @create 2026/7/13
|
|
|
+ */
|
|
|
+public class Demo06 {
|
|
|
+ public static void main(String[] args) {
|
|
|
+ // ========== 表达式提升 ==========
|
|
|
+ // byte/short/char 参与运算时自动提升为 int
|
|
|
+ byte a = 15;
|
|
|
+ short b = 20;
|
|
|
+ // byte c1 = a + b; // ❌ 编译错误
|
|
|
+ // short c2 = a + b; // ❌ 编译错误
|
|
|
+ int c3 = a + b; // ✅ 正确
|
|
|
+
|
|
|
+ // ========== 整数除法截断 ==========
|
|
|
+ System.out.println(10 / 3); // 3(截断)
|
|
|
+ System.out.println(10 / 3.0); // 3.3333...
|
|
|
+
|
|
|
+ // ========== char 与 int 转换 ==========
|
|
|
+ char cc = 'A';
|
|
|
+ int d1 = cc + 6; // 'A'的ASCII码65 + 6 = 71
|
|
|
+ System.out.println(d1); // 71
|
|
|
+
|
|
|
+ // 直接为 char 赋整数值
|
|
|
+ char c6 = 97;
|
|
|
+ System.out.println(c6); // 'a'
|
|
|
+ }
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
---
|
|
|
|
|
|
## 九、随堂练习要点
|
|
|
@@ -368,6 +569,12 @@ public class Demo04 {
|
|
|
9. 理解 bit(位)与 byte(字节)的关系及存储单位换算
|
|
|
10. 记住 `String` 是引用数据类型,**不是关键字**,采用大驼峰命名
|
|
|
11. **个人简历练习**:为姓名、年龄、学号、性别、身高、体重、学校、专业、班级、爱好选择合适的数据类型并输出
|
|
|
+12. 掌握**自动转换**方向:`byte → short → int → long → float → double`
|
|
|
+13. 掌握**强制转换**语法:`(目标类型) 变量`,理解精度丢失和溢出
|
|
|
+14. `byte`、`short`、`char` 参与运算自动提升为 `int`
|
|
|
+15. 整数除法结果直接**截断小数**,不是四舍五入
|
|
|
+16. `char` 本质是数值类型,可查询 **ASCII 码表** 与 `int` 相互转换
|
|
|
+17. 区分**编码**(字符→二进制)与**解码**(二进制→字符),了解常见字符集(ASCII、GBK、Unicode、UTF-8)
|
|
|
|
|
|
---
|
|
|
|