变量与数据类型
概述
变量用于在程序中存储数据,每个变量都有类型和名字,类型决定了能存什么值、占多少内存。Java 是静态类型语言:变量一旦声明了类型就不能再改,编译期就能发现很多类型错误。掌握变量与数据类型是书写正确、高效 Java 代码的基础。
本文介绍:变量的声明与初始化、Java 的八种基本数据类型、字面量写法、类型转换,以及常见注意事项。
前置建议
已能编写并运行 第一个 Java 程序,在 main 方法或其它方法里即可练习本文中的示例。
变量的声明与初始化
基本语法
声明变量时需指定类型和变量名,可同时赋初值(初始化):
// 语法:类型 变量名;
// 或: 类型 变量名 = 初值;
int age; // 仅声明,未赋值
int count = 0; // 声明并初始化
String name = "张三"; // 引用类型同样适用注意
局部变量(在方法内声明的变量)使用前必须被赋值,否则编译报错。仅声明不赋值的局部变量不能参与运算或打印。
命名规则与规范
- 允许:字母、数字、下划线
_、美元符$;不能以数字开头。 - 规范:变量名使用 camelCase(小驼峰),见名知意。
int userName; // 推荐
int user_name; // 合法但不推荐(Java 惯例用驼峰)
int _count; // 合法,但不建议以下划线开头
// int 2nd; // 错误:不能以数字开头基本数据类型(八种)
Java 有 8 种基本数据类型,分为四类:整型、浮点型、字符型、布尔型。它们不是对象,存储在栈上,有默认值(仅作为类的成员变量时生效,局部变量无默认值)。
整型
| 类型 | 字节 | 取值范围(含) | 默认值 |
|---|---|---|---|
byte | 1 | -128 ~ 127 | 0 |
short | 2 | -32_768 ~ 32_767 | 0 |
int | 4 | 约 ±21 亿 | 0 |
long | 8 | 约 ±9×10¹⁸ | 0L |
日常最常用 int;需要更大范围时用 long。long 字面量建议加后缀 L(或小写 l,易与 1 混淆,故推荐 L)。
int score = 100;
long population = 7_800_000_000L; // 下划线便于阅读,编译时忽略
byte b = 127;浮点型
| 类型 | 字节 | 精度说明 | 默认值 |
|---|---|---|---|
float | 4 | 约 6~7 位有效数字 | 0.0f |
double | 8 | 约 15 位有效数字 | 0.0d |
默认小数是 double;写 float 字面量需加后缀 f 或 F。
double price = 19.99;
float rate = 0.05f; // 必须加 f,否则 0.05 被视为 double,赋给 float 需强转字符型
| 类型 | 字节 | 说明 | 默认值 |
|---|---|---|---|
char | 2 | 单个 Unicode 字符 | '\u0000' |
用单引号表示一个字符,双引号是字符串(String,引用类型)。
char grade = 'A';
char ch = '中';
char newline = '\n'; // 转义:换行布尔型
| 类型 | 说明 | 默认值 |
|---|---|---|
boolean | 仅 true / false | false |
Java 中 boolean 不能与数字互转,不能写 if (1),只能写 if (condition)。
boolean isOk = true;
boolean flag = (10 > 5);字面量
字面量是直接在代码中写出的常量值。
整数字面量
int a = 100; // 十进制
int b = 0xFF; // 十六进制,255
int c = 012; // 八进制,10
long d = 100L; // long 建议加 L浮点字面量
double d1 = 3.14;
double d2 = 1.5e2; // 科学计数法,150.0
float f = 2.5f; // float 必须加 f字符与字符串字面量
char c = 'x';
String s = "Hello";
// 常见转义:\n 换行 \t 制表 \" \' \\类型转换
自动类型提升(隐式)
从小范围类型赋给大范围类型时,编译器自动提升,无需强转:
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 等。运算时小类型也会先提升再参与计算。
强制类型转换(显式)
从大范围到小范围,或从浮点到整型,必须强制转换,可能丢失精度或溢出:
double d = 3.99;
int i = (int) d; // 截断小数部分,i 为 3
long big = 300L;
int n = (int) big; // 若 big 超出 int 范围,会得到「错误」的数值注意
强制转换时若超出目标类型范围,不会抛异常,而是得到「溢出」后的值,难以排查。大范围整型转小范围整型时要格外小心。
示例:运算中的类型提升
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,
boolean为false,引用为null)。详细在 类与对象 中学习。
public class VariableDemo {
private int count; // 成员变量,默认 0
public void run() {
int local = 10; // 局部变量,必须赋值后才能用
System.out.println(local);
System.out.println(count); // 成员变量可直接用,此时为 0
}
}注意事项
默认值仅针对成员变量
局部变量没有默认值,使用前必须初始化,否则编译错误:
public static void main(String[] args) {
int x;
// System.out.println(x); // 编译错误:可能尚未初始化
x = 5;
System.out.println(x); // 正确
}浮点数比较
浮点数有精度误差,不要用 == 直接比较,应比较差值或使用 BigDecimal:
// 不推荐
if (0.1 + 0.2 == 0.3) { } // 可能为 false
// 推荐:比较差值在一定范围内
if (Math.abs((0.1 + 0.2) - 0.3) < 1e-9) { }命名与可读性
变量名要能表达含义,避免单字母(除循环变量 i、j 等)。常量使用 UPPER_SNAKE_CASE,并用 final 修饰(参见 流程控制 与后续进阶)。
小结
- 变量:类型 + 名字,局部变量使用前必须赋值。
- 八种基本类型:
byte/short/int/long、float/double、char、boolean;整型常用int,大数用long;小数默认double,float字面量加f。 - 类型转换:小→大自动提升,大→小或浮点→整型需强转,注意溢出与精度丢失。
- 字面量:整型可加
L,浮点可加f,注意char单引号、String双引号。
下一步可学习 运算符,再结合 流程控制 和 数组 巩固变量与类型的用法。