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占用空间较小,只能保存范围较小的整数。

java
byte age = 18;
byte temperatlure = -10;

如果数值超出 byte的范围,代码将无法通过编译。

java
byte number = l28 // 编译错误

1.2 short

short的取值范围比 byte更大,但在实际业务代码中使用较少。

java
short year = 2026
short count = 30000;

1.3 int

int是 Java 中最常用的整数类型。没有特殊要求时,普通整数通常使用 int

java
int age = 20;
int studentCount = 1000;
int score = 95;

Java 中的整数字面量默认是 int类型。

1.4 long

long用于保存较大的整数,常见于数据库主键、时间戳和较大的统计数据。

java
long userId = 10000000001L;
long timestamp = 1770000000000L;

定义较大的 long字面量时,需要在数字后添加 L

java
long number = 10000000000L;

建议使用大写 L,避免与数字 1混淆。


2.浮点类型

浮点类型用于保存带有小数部分的数字。

类型 占用空间 大致精度
float 4 字节 约 6~7 位有效数字
double 8 字节 约 15~16 位有效数字

2.1 float

定义 float类型的小数时,需要在数字后面添加 F或者 f

java
float price = 19.9F;
float score = 95.5F;

下面的代码无法通过编译:

java
float price = 19.9; // 编译错误

这是因为 Java 中的小数字面量默认是 double类型。

2.2 double

double是 Java 中最常见的浮点数类型。

java
double height = 175.5;
double weight = 65.8;
double distance = 12345.678;

小数字面量默认就是 double类型,因此通常不需要添加后缀。


3.浮点数精度问题

floatdouble使用二进制浮点数保存数据,部分十进制小数无法被精确表示。

java
double result = 0.1 + 0.2;
System.out.println(result);

输出结果可能是:

因此,floatdouble不适用于金额等要求精确计算的场景。
金额计算通常使用 BigDecimal

java
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 个字节。

java
char grade = 'A';
char chinese = '中';
char number = '1';
char sysmbol = '#';

char类型必须使用单引号:

java
char letter = 'A';

双引号表示字符串:

java
String name = "Java";

String不是基本数据类型,而是引用数据类型。
需要注意,字符 '1'和整数 1是不同的数据:

java
char character = '1';
int number = 1;

4.1 char 与整数的关系

char保存的是字符串对应的数值,因此可以参与整数运算。

java
char letter = 'A';

System.out.println(letter);
System.out.((int) letter);

输出结果:

也可以通过 Unicode 编码定义字符:

java
char letter = '\u0041';

System.out.println(letter);

输出结果:

需要注意,char表示的是一个 UTF-16 代码单元。部分表情符号和生僻字符可能需要两个 char 才能完整表示。


5.布尔类型

boolean用于表示逻辑状态,只有两个取值:
true
false
示例:

java
boolean isLogin = true;
boolean isDeleted = false;
boolean passed = true;

boolean经常用于条件判断:

java
boolean isAdult = true;
if (isAdult) {
    System.out.println("已经成年");
}

java 中不能使用 01代替布尔值。

java
boolean flag = 1; // 编译错误

6.基本数据类型示例

java
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
示例:
java
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);
    }
}

局部变量没有默认值,必须先赋值再使用。

java
public class LocalVariableDemo {
    public static void main(String[] args) {
        int number;

        System.out.println(number); // 编译错误
    }
}

正确写法:

java
int number = 10;

System.out.println(number);

8.基本数据类型

 基本数据类型之间的转换主要分为:

  • 自动类型转换
  • 强制类型转换

8.1 自动类型转换

将取值范围较小的类型转换为取值范围较大的类型时,Java 通常可以自动完成转换。

java
int number = 100;
long longNumber = number;
double doubleNumber = longNumber;

常见的自动转换方向为:
byte -> short -> int -> long -> float -> double
char可以先自动转换为 intlongfloat、或 double

java
char letter = 'A';
int number = letter;

System.out.println(number);

输出结果:

需要注意,自动转换不一定代表数值始终能够被精确保存。例如,较大的 long转换为 float时,可能产生精度损失。

8.2 强制类型转换

将取值范围较大的类型转换为取值范围较小的类型时,需要进行强制类型转换为取值较小的类型时,需要进行强制类型转换。

java
double price = 19.9;
int number = (int) price;

System.out.println(number);

输出结果:
19
小数部分会被直接舍弃,不会进行四舍五入。
强制转换还可能产生数据溢出:

java
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
基本类型转换为包装类型为自动装箱:
java
int number = 10;
Integer integer = number;

包装类转换为基本类型称为自动拆箱:

java
Integer integer = 10;
int number = integer;

集合和泛型中不能直接使用基本数据类型,需要使用对应的包装类。
正确写法:

java
List<Integer> numbers = new ArrayList<>();

错误写法:

java
List<int> numbers; // 编译错误

包装类可以保存 null,基本数据类型不能保存 null

java
Integer number = null;

自动拆箱时需要注意空指针异常:

java
Integer value = null;
int number = value; // NullPointerException

10.如何选择数据类型

实际开发中,可以按照以下方式选择:

使用场景 推荐类型
普通整数 int
较大的整数 long
数据库主键 long 或包装类 Long
普通小数 double
精确金额计算 BigDecimal
单个字符 char
逻辑状态 boolean
二进制数据 byte
在普通业务开发中,最常使用的基本数据类型是:
text
int
long
double
boolean

byteshortfloat的使用频率相对较低。