Java
Java 基本数据类型详解
本文介绍 Java 的 8 种基本数据类型,并说明它们的取值范围、默认值、类型转换、包装类及常见使用场景,帮助初学者快速掌握 Java 数据类型基础。

Java 是一种强类型语言,变量在声明时必须明确指定数据类型。
Java 中的数据类型主要分为两类:
- 基本数据类型
- 引用数据类型
Java 一共有 8 种基本数据类型,可以分为整数、浮点数、字符和布尔值四类。
| 分类 | 数据类型 |
|---|---|
| 整数类型 | byte、shot、int、long |
| 浮点数类型 | float、double |
| 字符类型 | char |
| 布尔类型 | boolean |
1.整数类型
整数类型用于保存不包含小数部分的数字。
| 类型 | 占用空间 | 取值范围 |
|---|---|---|
| byte | 1 字节 | -128 ~ 127 |
| short | 2 字节 | -32768 ~32767 |
| int | 4 字节 | -2^31^ ~ 2^31^-1 |
| long | 8 字节 | -2^63^ ~ 2^63^-1 |
1.1 byte
byte占用空间较小,只能保存范围较小的整数。
byte age = 18;
byte temperatlure = -10;
如果数值超出 byte的范围,代码将无法通过编译。
byte number = l28 // 编译错误
1.2 short
short的取值范围比 byte更大,但在实际业务代码中使用较少。
short year = 2026
short count = 30000;
1.3 int
int是 Java 中最常用的整数类型。没有特殊要求时,普通整数通常使用 int。
int age = 20;
int studentCount = 1000;
int score = 95;
Java 中的整数字面量默认是 int类型。
1.4 long
long用于保存较大的整数,常见于数据库主键、时间戳和较大的统计数据。
long userId = 10000000001L;
long timestamp = 1770000000000L;
定义较大的 long字面量时,需要在数字后添加 L。
long number = 10000000000L;
建议使用大写 L,避免与数字 1混淆。
2.浮点类型
浮点类型用于保存带有小数部分的数字。
| 类型 | 占用空间 | 大致精度 |
|---|---|---|
| float | 4 字节 | 约 6~7 位有效数字 |
| double | 8 字节 | 约 15~16 位有效数字 |
2.1 float
定义 float类型的小数时,需要在数字后面添加 F或者 f。
float price = 19.9F;
float score = 95.5F;
下面的代码无法通过编译:
float price = 19.9; // 编译错误
这是因为 Java 中的小数字面量默认是 double类型。
2.2 double
double是 Java 中最常见的浮点数类型。
double height = 175.5;
double weight = 65.8;
double distance = 12345.678;
小数字面量默认就是 double类型,因此通常不需要添加后缀。
3.浮点数精度问题
float和 double使用二进制浮点数保存数据,部分十进制小数无法被精确表示。
double result = 0.1 + 0.2;
System.out.println(result);
输出结果可能是:
因此,float和 double不适用于金额等要求精确计算的场景。
金额计算通常使用 BigDecimal:
import java.math.BigDecimal;
public class MoneyDemo {
public static void main(String[] args) {
BigDecimal first = new BigDemcial("0.1");
BigDecimal second = new BigDemcial("0.2");
BigDecimal result = first.add(second);
System.out.println(result);
}
}
输出结果:
创建 BigDecimal时,通常应使用字符串参数,避免先产生浮点数精度误差。
4.字符类型
char用于保存单个字符,占用 2 个字节。
char grade = 'A';
char chinese = '中';
char number = '1';
char sysmbol = '#';
char类型必须使用单引号:
char letter = 'A';
双引号表示字符串:
String name = "Java";
String不是基本数据类型,而是引用数据类型。
需要注意,字符 '1'和整数 1是不同的数据:
char character = '1';
int number = 1;
4.1 char 与整数的关系
char保存的是字符串对应的数值,因此可以参与整数运算。
char letter = 'A';
System.out.println(letter);
System.out.((int) letter);
输出结果:
也可以通过 Unicode 编码定义字符:
char letter = '\u0041';
System.out.println(letter);
输出结果:
需要注意,char表示的是一个 UTF-16 代码单元。部分表情符号和生僻字符可能需要两个 char 才能完整表示。
5.布尔类型
boolean用于表示逻辑状态,只有两个取值:
true
false
示例:
boolean isLogin = true;
boolean isDeleted = false;
boolean passed = true;
boolean经常用于条件判断:
boolean isAdult = true;
if (isAdult) {
System.out.println("已经成年");
}
java 中不能使用 0和 1代替布尔值。
boolean flag = 1; // 编译错误
6.基本数据类型示例
public class DataTypeDemo {
public static void main(String[] args) {
byte age = 18;
short year = 2026;
int count = 100000;
long userId = 10000000001L;
float price 19.9F;
double height = 175.5;
System.out.println(age);
System.out.println(year);
System.out.println(count);
System.out.println(userId);
System.out.println(price);
System.out.println(height);
System.out.println(grade);
System.out.Println(passed);
}
}
7.基本数据类型的默认值
基本数据类型作为成员变量时,Java 会自动设置默认值。
| 数据类型 | 默认值 |
|---|---|
| byte | 0 |
| short | 0 |
| int | 0 |
| long | 0L |
| float | 0.0F |
| double | 0.0D |
| char | ‘\u0000’ |
| boolean | false |
| 示例: |
public class DefaultValueDemo {
int count;
double price;
char grade;
boolean enabled;
public static void main(String[] args) {
DefaultValueDemo demo = new DefaultValueDemo();
System.out.println(demo.count);
System.out.println(demo.price);
System.out.println(demo.grade);
System.out.println(demo.enabled);
}
}
局部变量没有默认值,必须先赋值再使用。
public class LocalVariableDemo {
public static void main(String[] args) {
int number;
System.out.println(number); // 编译错误
}
}
正确写法:
int number = 10;
System.out.println(number);
8.基本数据类型
基本数据类型之间的转换主要分为:
- 自动类型转换
- 强制类型转换
8.1 自动类型转换
将取值范围较小的类型转换为取值范围较大的类型时,Java 通常可以自动完成转换。
int number = 100;
long longNumber = number;
double doubleNumber = longNumber;
常见的自动转换方向为:
byte -> short -> int -> long -> float -> double
char可以先自动转换为 int、long、float、或 double。
char letter = 'A';
int number = letter;
System.out.println(number);
输出结果:
需要注意,自动转换不一定代表数值始终能够被精确保存。例如,较大的 long转换为 float时,可能产生精度损失。
8.2 强制类型转换
将取值范围较大的类型转换为取值范围较小的类型时,需要进行强制类型转换为取值较小的类型时,需要进行强制类型转换。
double price = 19.9;
int number = (int) price;
System.out.println(number);
输出结果:
19
小数部分会被直接舍弃,不会进行四舍五入。
强制转换还可能产生数据溢出:
int number = 130;
byte result = (byte) number;
System.out.println(result);
输出结果:
因此,强制类型转换需要确认原始数据是否在目标类型的取值范围内。
9.基本类型对应的包装类
Java 为每种基本数据类型提供了对应的包装类。
| 基本数据类型 | 包装类 |
|---|---|
| byte | Byte |
| short | Short |
| int | Interger |
| long | Long |
| float | Float |
| double | Double |
| char | Character |
| boolean | Boolean |
| 基本类型转换为包装类型为自动装箱: |
int number = 10;
Integer integer = number;
包装类转换为基本类型称为自动拆箱:
Integer integer = 10;
int number = integer;
集合和泛型中不能直接使用基本数据类型,需要使用对应的包装类。
正确写法:
List<Integer> numbers = new ArrayList<>();
错误写法:
List<int> numbers; // 编译错误
包装类可以保存 null,基本数据类型不能保存 null:
Integer number = null;
自动拆箱时需要注意空指针异常:
Integer value = null;
int number = value; // NullPointerException
10.如何选择数据类型
实际开发中,可以按照以下方式选择:
| 使用场景 | 推荐类型 |
|---|---|
| 普通整数 | int |
| 较大的整数 | long |
| 数据库主键 | long 或包装类 Long |
| 普通小数 | double |
| 精确金额计算 | BigDecimal |
| 单个字符 | char |
| 逻辑状态 | boolean |
| 二进制数据 | byte |
| 在普通业务开发中,最常使用的基本数据类型是: |
int
long
double
boolean
byte、short和 float的使用频率相对较低。