基本数据类型
本教程共 100 篇 · 第 11 篇 · 更新于 2026-08-05 · 约 5 分钟阅读
11. 基本数据类型
本节目标:搞清楚 Java 有哪些内置的基本数据类型,各自占多大内存、能存多大范围,以及写字面量时的各种小写法。
先声明,再用
Java 是静态类型语言。这句话的意思是:每个变量在用之前,必须先说清楚它是什么类型。
比如你要存一个整数,得先写 int age;,告诉编译器「age 是个整数」。之后 age 里就只能装整数,塞别的东西编译器不让。
这种「类型先行」的设计,能在写代码阶段就拦下一大批错误。代价是你得多打几个字,但换来的是稳。
除了 8 种下面要讲的基本类型,Java 还有一类引用类型(比如 String、数组、你自己写的类)。两者最大的区别:基本类型直接存值,引用类型存的是「指向对象的地址」。本章只聊基本类型。
八种基本类型一览
Java 内置了 8 种基本数据类型,分成四类:
| 类别 | 类型 | 位数 | 取值范围 |
|---|---|---|---|
| 整数 | byte | 8 位 | -128 ~ 127 |
| 整数 | short | 16 位 | -32768 ~ 32767 |
| 整数 | int | 32 位 | 约 ±21 亿 |
| 整数 | long | 64 位 | 非常大 |
| 浮点 | float | 32 位 | 小数,精度有限 |
| 浮点 | double | 64 位 | 小数,默认用这个 |
| 字符 | char | 16 位 | 单个 Unicode 字符 |
| 布尔 | boolean | 1 位 | true / false |
日常写业务,int 和 double 用得最多。long 在数量很大(如时间戳、文件大小)时才上。byte、short 多在省内存的数组里出现,初学基本碰不到。
整数类型怎么写
byte b = 100;
short s = 10000;
int i = 100000;
long n = 10000000000L; // 注意末尾的 L
```bash
`long` 类型的字面量必须在数字后加 `L`(推荐大写,小写 `l` 容易和 `1` 看混)。不加的话,数字默认是 `int`,超过 `int` 范围就报错。
> [!WARNING]
> 忘了给 `long` 加 `L` 是新手高频错误。比如 `long x = 3000000000;`(30 亿超过 int 上限约 21 亿)会直接编译报错。补上 `L` 即可。
## 浮点类型怎么写
带小数点的数默认是 `double`。要表示 `float`,得在数字后加 `F`:
```java
double d = 3.14; // 默认就是 double
float f = 3.14F; // 必须加 F,否则类型不匹配
Note浮点数不能用来精确表示钱。比如
0.1 + 0.2在浮点里并不严格等于0.3。涉及金额要用java.math.BigDecimal。这是后面会专门讲的内容,现在先记住「别用 float/double 算钱」。
字符 char 与布尔 boolean
char 存单个字符,用单引号包起来:
char c = 'A';
char zh = '中';
```java
Java 的 `char` 是 16 位 Unicode,所以一个汉字也能直接存。
`boolean` 只有两个值,用来表示「真 / 假」:
```java
boolean isOpen = true;
boolean loggedIn = false;
它常用于条件判断。注意 Java 里 boolean 不能当成 0 或 1 用——if (1) 这种写法在 Java 是非法的,必须写成 if (flag)。
两个容易忽略的点
char 骨子里是个数字。 它存的其实是对应的 Unicode 编码值,所以能直接参与数学运算:
char c = 'A'; // 'A' 的编码是 65
c = (char) (c + 1); // 65 + 1 = 66,对应 'B'
System.out.println(c); // 输出 B
```bash
大写字母 A~Z 的编码是连续的 65~90,所以这段能顺推到下一个字母。做这种运算时 `char` 会先提升成 `int`,加完还得强转回 `char`。
**`boolean` 不能和其他类型互转。** 很多语言里 `0` 代表假、非 `0` 代表真,但 Java 不行。`boolean` 就是独立的类型,既不能把 `int` 赋给 `boolean`,也不能把 `boolean` 当数字用。这是故意设计成这样,避免把「真假」和「数字」混为一谈的坑。
## 字面量的花样写法
数字字面量不止一种写法,掌握几个常用的就够。
**十六进制**加 `0x` 前缀,**二进制**加 `0b` 前缀(Java 7 引入):
```java
int dec = 26; // 十进制 26
int hex = 0x1a; // 十六进制,等于 26
int bin = 0b11010; // 二进制,等于 26
科学计数法用 e:
double d = 1.234e2; // 等于 123.4
```java
**下划线分隔**(Java 7 引入),让长数字更好读,编译器会忽略:
```java
long card = 1234_5678_9012_3456L;
int bits = 0b1010_1100;
Tip下划线只能放在数字之间,不能开头、结尾,也不能紧贴小数点或
L/F后缀。写长数字时善用下划线,可读性提升明显。
默认值的小差别
如果你声明一个字段(类的成员变量)却没给初值,编译器会给它一个默认值:数字类型是 0,boolean 是 false,char 是 \u0000。
但局部变量(方法里声明的)没有默认值。不赋值就用,编译器直接报错。
public class DefaultDemo {
int fieldAge; // 字段,默认 0
public void test() {
int localAge; // 局部变量
// System.out.println(localAge); // 报错:可能尚未初始化
}
}
```bash
## 到底该用哪个类型
面对这么多类型,初学最容易纠结「我该选哪个」。给个简单决策:
- 存整数,默认用 `int`;数字特别大(如毫秒时间戳)才上 `long`。
- 存小数,默认用 `double`。除非你明确知道在做什么,否则别碰 `float`。
- 存单个字符用 `char`;存一段文字用 `String`(引用类型,后面讲)。
- 存真假用 `boolean`。
- `byte`、`short` 基本只在「超多数据、要省内存的数组」里才出现,初学阶段可以忽略。
记住:**先用 `int` 和 `double` 打天下**,其它的等真遇到场景再说。类型选错大不了改一行,不必在开始就过度纠结。
> [!NOTE]
> 本章的 8 种基本类型都不是对象。Java 里还有一套对应的「包装类型」(如 `Integer` 对应 `int`、`Double` 对应 `double`),用于在需要对象的场合使用。它们到后面讲集合、泛型时会出现,现在你只需知道「基本类型存值、轻量高效」就够了。
## 小结
Java 是静态类型语言,变量必须先声明类型。8 种基本类型分整数、浮点、字符、布尔四类。
`long` 字面量加 `L`,`float` 字面量加 `F`;浮点别用于金额计算。
字面量支持十六进制 `0x`、二进制 `0b`、科学计数 `e`、下划线分隔。字段有默认值,局部变量必须显式初始化。