2.4 Java的基础概念(数据类型)
一、什么是数据类型?
在 Java 中,数据类型决定了三件事:
- 存什么:变量能存储的数据种类(是整数、小数还是文字?)。
- 占多大:在内存中占用多少空间(字节数)。
- 怎么算:支持哪些操作(如加减运算、逻辑比较)。
Java 是强类型语言。所有变量必须先声明类型,且类型一旦确定,通常不能随意改变。
二、Java 数据类型的分类
Java 的数据类型主要分为两大类:基本数据类型和引用数据类型。
Data Types(数据类型)
/ \
Primitive Types(基本/原始类型) Reference Types(引用类型)
graph TD A[Data Types 数据类型] --> B(Primitive Types 基本类型) A --> C(Reference Types 引用类型)1. 基本数据类型(Primitive Types)
共8 种,直接存储值本身,效率极高,通常存储在**栈(Stack)**内存中。
| 分类 | 类型关键字 | 字节 | 取值范围/说明 | 默认值 |
|---|---|---|---|---|
| 整数型 | byte | 1 | -128 ~ 127 | 0 |
short | 2 | -32,768 ~ 32,767 | 0 | |
int | 4 | 约 ±21亿 (-2³¹ ~ 2³¹−1) | 0 | |
long | 8 | 约 ±9.2×10¹⁸ | 0L | |
| 浮点型 | float | 4 | 单精度 (6~7位有效数字) | 0.0f |
double | 8 | 双精度 (15~16位有效数字) | 0.0 | |
| 字符型 | char | 2 | 0 ~ 65,535 (Unicode 编码) | '\u0000' |
| 布尔型 | boolean | 未定义 | true/false | false |
- Long:字面量必须加
L或l(建议大写 L,避免与数字 1 混淆)。- Float:字面量必须加
F或f。- Double:Java 默认的浮点类型,不加后缀即为 double。
long bigNum = 1234567890123L; float price = 19.99f; // 不加 f 会报错,因为默认是 double2. 引用数据类型(Reference Types)
存储的是对象的引用(内存地址),实际对象存储在**堆(Heap)**内存中。
- 类(Class):如
String,Scanner, 自定义类。 - 接口(Interface):如
List,Runnable。 - 数组(Array):如
int[],String[]。 - 枚举(Enum)。
String name = "Alice"; // name 是引用,指向堆中的对象 int[] nums = new int[5]; // nums 是数组引用三、基本类型 vs 引用类型
| 特性 | 基本类型 | 引用类型 |
|---|---|---|
| 存储内容 | 实际数值 | 对象的内存地址 |
| 存储位置 | 栈(Stack) | 引用在栈,对象在堆 |
| 默认值 | 0, false, '\u0000' | null |
| 是否有方法 | 无 | 有(如.length()) |
| 内存开销 | 小,高效 | 相对较大 |
四、字面量(Literals)
字面量是直接写在代码中的常量值。
| 类型 | 字面量示例 | 说明 |
|---|---|---|
| 整数 | 42,0b101 | 默认是int |
| 长整数 | 100L | 必须带L |
| 浮点数 | 3.14 | 默认是double |
| 单精度 | 3.14f | 必须带f |
| 字符 | 'A','\n' | 单引号,只能存一个字符 |
| 字符串 | "Hello" | 双引号,属于引用类型 |
| 布尔 | true,false | 仅两个值 |
五、类型转换(Type Conversion)
1. 自动类型提升(Widening)
小范围 → 大范围,安全,自动完成。
- 顺序:
byte→short→int→long→float→double - 特例:
char→int
int a = 100; double d = a; // 自动转为 100.02. 强制类型转换(Narrowing)
大范围 → 小范围,可能丢失精度,需显式转换。
- 语法:
(目标类型) 变量名
double x = 123.456; int n = (int) x; // 结果:123(直接截断小数,不四舍五入!)布尔类型(boolean)不能与其他任何类型进行转换!
六、包装类(Wrapper Classes)
Java 为每个基本类型提供了对应的类,主要用于集合(泛型)和工具方法。
| 基本类型 | 包装类 | 基本类型 | 包装类 |
|---|---|---|---|
byte | Byte | int | Integer |
short | Short | long | Long |
float | Float | double | Double |
char | Character | boolean | Boolean |
自动装箱与拆箱(JDK 5+):
Integer num = 100; // 自动装箱:基本类型 -> 对象 int n = num; // 自动拆箱:对象 -> 基本类型七、常见陷阱与最佳实践
1. 浮点数精度丢失
System.out.println(0.1 + 0.2); // 输出 0.30000000000000004 System.out.println(0.1 + 0.2 == 0.3); // false- 解决方案:涉及金额计算或高精度要求时,必须使用
BigDecimal。
2. String 是引用类型
"abc"是String对象,而'a'是char基本类型。- 比较字符串内容请用
.equals(),不要用==。
3. char 是无符号的
char范围是0~65535,不能存储负数。
最佳实践建议
- 默认选择:整数用
int,小数用double。 - 大数处理:超出
int范围再用long。 - 常量命名:使用
static final+ 全大写。public static final double PI = 3.14159;
八、练习
public class TextData { public static void main(String[] args) { String name = "黑马谢广坤"; int age = 18; char sex = '男'; double height = 180.1; boolean flag = true; System.out.println("姓名为:" + name); System.out.println("年龄为:" + age); System.out.println("性别为" + sex); System.out.println("身高为:" + height); System.out.println("是否单身:" + flag); } }