讲解

Java 有且只有八种基本数据类型(primitive types),它们是语言的「原子」,其他一切类型都由它们组合而成。按家族分:整数四种——byte(1 字节)、short(2 字节)、int(4 字节)、long(8 字节),区别只在能装的数值范围;浮点数两种——float(4 字节)和 double(8 字节),表示带小数的数;字符一种——char,存单个字符;布尔一种——boolean,只有 true 和 false 两个值。int 和 double 是默认选择,拿不准就用它们。

基本类型之外的所有类型(包括 String)都叫引用类型,两者行为差异很大:基本类型的变量直接存值,赋值时是复制一份;引用类型的变量存的是对象的「地址」,赋值时复制的是地址。基本类型的变量只要声明在方法里就必须先赋值才能用;而作为类的成员字段时,它们会自动获得默认值(int 是 0、boolean 是 false 等)。

类型转换分两种方向:从小范围转大范围(如 int 转 long、int 转 double)自动进行,叫 widening;从大范围转小范围(如 double 转 int)必须写强制转换 (int) 3.99,并且会丢失精度——小数部分被直接截断而不是四舍五入。还要警惕整数溢出:int 最大约 21 亿,再加 1 不会报错,而是「绕回」最小值,运算可能溢出时改用 long 或先检查范围。

示例

八种基本类型一次看全,long 字面量加 L 后缀、float 加 f 后缀:

public class Main {
    public static void main(String[] args) {
        byte b = 100;
        short s = 30000;
        int i = 2000000000;
        long big = 9000000000L;
        float f = 3.14f;
        double d = 3.141592653589793;
        char c = '中';
        boolean flag = true;

        System.out.println("byte: " + b + ", short: " + s);
        System.out.println("int: " + i + ", long: " + big);
        System.out.println("float: " + f + ", double: " + d);
        System.out.println("char: " + c + ", boolean: " + flag);
    }
}

强制转换会截断小数,整数溢出会悄悄绕回(不会报错):

public class Main {
    public static void main(String[] args) {
        double pi = 3.99;
        int truncated = (int) pi;
        System.out.println("(int) 3.99 = " + truncated);

        int max = Integer.MAX_VALUE;
        System.out.println("int 最大值:" + max);
        System.out.println("再加 1 溢出为:" + (max + 1));

        long safe = (long) max + 1;
        System.out.println("用 long 计算:" + safe);

        char letter = 'A';
        System.out.println("A 的下一个字符:" + (char) (letter + 1));
    }
}

常见坑

  • 用 float/double 算钱:0.1 + 0.2 不等于 0.3,浮点数用二进制近似十进制小数,金额计算会产生误差。财务场景使用 BigDecimal,入门期先记住「浮点不精确」。
  • 整数除法丢掉小数:int 除以 int 结果还是 int,7 / 2 得 2。想要小数结果,至少一边写成 7.0 / 2 或强制转换。
  • long 字面量忘加 L:数字超过 int 范围时,9000000000 不加分号后缀 L 会直接编译报错,因为字面量默认按 int 解析。
  • char 和 String 混用引号:char 用单引号且只能装一个字符('中'),String 用双引号("中文")。"中" 是 String 不是 char,类型对不上就编译失败。

小结

八种基本类型分整数、浮点、字符、布尔四族;自动转换只朝大范围走,强制转换会丢精度,溢出不会报错。下一节学习对这些值做运算:运算符。