Skip to content

变量与数据类型

概述

变量用于在程序中存储数据,每个变量都有类型名字,类型决定了能存什么值、占多少内存。Java 是静态类型语言:变量一旦声明了类型就不能再改,编译期就能发现很多类型错误。掌握变量与数据类型是书写正确、高效 Java 代码的基础。

本文介绍:变量的声明与初始化、Java 的八种基本数据类型、字面量写法、类型转换,以及常见注意事项。

前置建议

已能编写并运行 第一个 Java 程序,在 main 方法或其它方法里即可练习本文中的示例。


变量的声明与初始化

基本语法

声明变量时需指定类型变量名,可同时赋初值(初始化):

java
// 语法:类型 变量名;
// 或:  类型 变量名 = 初值;

int age;              // 仅声明,未赋值
int count = 0;        // 声明并初始化
String name = "张三"; // 引用类型同样适用

注意

局部变量(在方法内声明的变量)使用前必须被赋值,否则编译报错。仅声明不赋值的局部变量不能参与运算或打印。

命名规则与规范

  • 允许:字母、数字、下划线 _、美元符 $;不能以数字开头。
  • 规范:变量名使用 camelCase(小驼峰),见名知意。
java
int userName;      // 推荐
int user_name;     // 合法但不推荐(Java 惯例用驼峰)
int _count;        // 合法,但不建议以下划线开头
// int 2nd;        // 错误:不能以数字开头

基本数据类型(八种)

Java 有 8 种基本数据类型,分为四类:整型、浮点型、字符型、布尔型。它们不是对象,存储在栈上,有默认值(仅作为类的成员变量时生效,局部变量无默认值)。

整型

类型字节取值范围(含)默认值
byte1-128 ~ 1270
short2-32_768 ~ 32_7670
int4约 ±21 亿0
long8约 ±9×10¹⁸0L

日常最常用 int;需要更大范围时用 longlong 字面量建议加后缀 L(或小写 l,易与 1 混淆,故推荐 L)。

java
int score = 100;
long population = 7_800_000_000L;  // 下划线便于阅读,编译时忽略
byte b = 127;

浮点型

类型字节精度说明默认值
float4约 6~7 位有效数字0.0f
double8约 15 位有效数字0.0d

默认小数是 double;写 float 字面量需加后缀 fF

java
double price = 19.99;
float rate = 0.05f;   // 必须加 f,否则 0.05 被视为 double,赋给 float 需强转

字符型

类型字节说明默认值
char2单个 Unicode 字符'\u0000'

用单引号表示一个字符,双引号是字符串(String,引用类型)。

java
char grade = 'A';
char ch = '中';
char newline = '\n';  // 转义:换行

布尔型

类型说明默认值
booleantrue / falsefalse

Java 中 boolean 不能与数字互转,不能写 if (1),只能写 if (condition)

java
boolean isOk = true;
boolean flag = (10 > 5);

字面量

字面量是直接在代码中写出的常量值。

整数字面量

java
int a = 100;        // 十进制
int b = 0xFF;       // 十六进制,255
int c = 012;        // 八进制,10
long d = 100L;      // long 建议加 L

浮点字面量

java
double d1 = 3.14;
double d2 = 1.5e2;   // 科学计数法,150.0
float f = 2.5f;      // float 必须加 f

字符与字符串字面量

java
char c = 'x';
String s = "Hello";
// 常见转义:\n 换行 \t 制表 \" \' \\

类型转换

自动类型提升(隐式)

从小范围类型赋给大范围类型时,编译器自动提升,无需强转:

java
int i = 100;
long l = i;      // int → long,自动
double d = i;    // int → double,自动
float f = 3;     // int → float,自动

提示

提升方向可理解为:byte → short → int → long → float → double,以及 char → int 等。运算时小类型也会先提升再参与计算。

强制类型转换(显式)

从大范围到小范围,或从浮点到整型,必须强制转换,可能丢失精度或溢出:

java
double d = 3.99;
int i = (int) d;    // 截断小数部分,i 为 3

long big = 300L;
int n = (int) big;  // 若 big 超出 int 范围,会得到「错误」的数值

注意

强制转换时若超出目标类型范围,不会抛异常,而是得到「溢出」后的值,难以排查。大范围整型转小范围整型时要格外小心。

示例:运算中的类型提升

java
int a = 10;
int b = 3;
double c = a / b;   // 先按 int 运算:10/3=3,再赋给 double,c=3.0

double d = (double) a / b;  // 先转 double,再除,d≈3.333...

局部变量与成员变量(简要)

  • 局部变量:在方法或代码块内声明,使用前必须赋值,无默认值;生命周期仅在当前方法/块内。
  • 成员变量(字段):在类内部、方法外声明,有默认值(数值为 0/0.0,booleanfalse,引用为 null)。详细在 类与对象 中学习。
java
public class VariableDemo {
    private int count;  // 成员变量,默认 0

    public void run() {
        int local = 10;  // 局部变量,必须赋值后才能用
        System.out.println(local);
        System.out.println(count);  // 成员变量可直接用,此时为 0
    }
}

注意事项

默认值仅针对成员变量

局部变量没有默认值,使用前必须初始化,否则编译错误:

java
public static void main(String[] args) {
    int x;
    // System.out.println(x);  // 编译错误:可能尚未初始化
    x = 5;
    System.out.println(x);    // 正确
}

浮点数比较

浮点数有精度误差,不要用 == 直接比较,应比较差值或使用 BigDecimal

java
// 不推荐
if (0.1 + 0.2 == 0.3) { }  // 可能为 false

// 推荐:比较差值在一定范围内
if (Math.abs((0.1 + 0.2) - 0.3) < 1e-9) { }

命名与可读性

变量名要能表达含义,避免单字母(除循环变量 ij 等)。常量使用 UPPER_SNAKE_CASE,并用 final 修饰(参见 流程控制 与后续进阶)。


小结

  • 变量:类型 + 名字,局部变量使用前必须赋值。
  • 八种基本类型byte/short/int/longfloat/doublecharboolean;整型常用 int,大数用 long;小数默认 doublefloat 字面量加 f
  • 类型转换:小→大自动提升,大→小或浮点→整型需强转,注意溢出与精度丢失。
  • 字面量:整型可加 L,浮点可加 f,注意 char 单引号、String 双引号。

下一步可学习 运算符,再结合 流程控制数组 巩固变量与类型的用法。


相关链接

基于 VitePress 构建