一、什么是变量?
定义:变量是程序中用于存储数据的基本单元,其值在程序运行过程中可以被修改。
类比:变量就像是一个“盒子”,盒子有名字(变量名),可以存放物品(数据),且物品的类型(数据类型)必须与盒子匹配。
二、变量的三要素
-
变量名:标识变量的名称(如
age
、userName
)。 -
数据类型:规定变量存储的数据种类(如
int
、String
)。 -
值:变量中存储的具体数据(如
18
、"张三"
)。
三、变量的声明与初始化
1. 变量声明
语法:数据类型 变量名;
示例:
int age; // 声明一个整型变量age
String name; // 声明一个字符串变量name
double salary; // 声明一个浮点型变量salary
2. 变量初始化
语法:数据类型 变量名 = 初始值;
示例:
int age = 25; // 声明并初始化
String name = "李四";
double salary = 15000.50;
3. 注意事项
-
必须初始化后才能使用:未赋值的变量直接使用会编译报错。
int count;
System.out.println(count); // 错误:变量count未初始化
- 可分开声明与赋值:
int x;
x = 10; // 后续赋值
四、变量的数据类型
1. 基本数据类型(Primitive Types)
类型 | 关键字 | 大小(字节) | 默认值 | 示例 |
---|---|---|---|---|
整型 | int | 4 | 0 | int num = 100; |
长整型 | long | 8 | 0L | long bigNum = 1000000000L; |
浮点型 | float | 4 | 0.0f | float price = 19.99f; |
双精度型 | double | 8 | 0.0 | double pi = 3.1415926; |
字符型 | char | 2 | '\u0000' | char grade = 'A'; |
布尔型 | boolean | 1 | false | boolean isPass = true; |
注意事项:
-
long
和float
类型赋值时需加后缀L
或f
。 -
char
类型用单引号,String
用双引号(注意区分)。
2. 引用数据类型(Reference Types)
-
对象类型:如
String
、数组、自定义类等。 -
默认值为
null
:
String text; // 默认值为null
int[] numbers; // 默认值为null
五、变量的作用域
作用域:变量在代码中的有效范围,由声明位置决定。
1. 局部变量(Local Variables)
-
定义:在方法或代码块内部声明的变量。
-
特点:
-
必须显式初始化后才能使用。
-
仅在声明它的代码块内有效。
-
示例:
public void calculate() {
int a = 10; // 局部变量a
if (a > 5) {
int b = 20; // 局部变量b,仅在if块内有效
System.out.println(a + b);
}
System.out.println(b); // 错误:b超出作用域
}
2. 成员变量(Instance Variables)
-
定义:在类内部、方法外部声明的变量。
-
特点:
-
属于对象实例,随对象创建而存在。
-
有默认值(如
int
默认0,boolean
默认false)。
-
示例:
public class Student {
String name; // 成员变量name(默认值null)
int age; // 成员变量age(默认值0)
public void show() {
System.out.println(name + "的年龄是" + age);
}
}
3. 静态变量(Static Variables)
-
定义:用
static
修饰的成员变量,属于类而非对象。 -
特点:
-
通过类名直接访问(如
ClassName.varName
)。 -
在程序启动时初始化,生命周期与类一致。
-
示例:
public class Company {
static String country = "中国"; // 静态变量
}
// 使用
System.out.println(Company.country); // 输出:中国
六、变量的命名规范
-
规则(必须遵守):
-
由字母、数字、下划线(_)、美元符($)组成,不能以数字开头。
-
区分大小写,且不能使用Java关键字(如
class
、public
)。
-
-
约定(推荐遵守):
-
小驼峰命名法:首个单词首字母小写,后续单词首字母大写(如
studentName
)。 -
见名知意:
age
而非a
,maxValue
而非mv
。
-
错误示例:
int 2years; // 错误:以数字开头
String class; // 错误:class是关键字
double max-value; // 错误:包含连字符
七、类型转换
1. 自动类型转换(隐式转换)
-
条件:小范围类型 → 大范围类型(如
int
→double
)。
示例:
int a = 10;
double b = a; // 自动转换:b = 10.0
2. 强制类型转换(显式转换)
-
条件:大范围类型 → 小范围类型,需手动转换。
语法:目标类型 变量名 = (目标类型)值;
示例:
double x = 9.87;
int y = (int) x; // y = 9(直接截断小数部分)
注意事项:
-
强制转换可能导致数据丢失或精度问题。
-
boolean
类型不能与其他类型互相转换。
八、实战示例
场景:计算圆的面积
public class Circle {
public static void main(String[] args) {
double radius = 5.0; // 半径
final double PI = 3.14159;// 常量(使用final修饰)
double area = PI * radius * radius;
System.out.println("圆的面积:" + area); // 输出:78.53975
}
}
关键点:
-
使用
double
保证精度。 -
PI
为常量,用final
修饰防止被修改。
九、常见问题与注意事项
变量重复声明:同一作用域内不能声明同名变量。
int x = 10;
int x = 20; // 错误:重复声明
作用域溢出:在代码块外访问局部变量。
{
int temp = 100;
}
System.out.println(temp); // 错误:temp已失效
类型不匹配:赋值时类型不一致。
int num = 10.5; // 错误:需强制转换
常量命名规范:全大写,单词间用下划线分隔。
final int MAX_SIZE = 100;
十、总结
-
变量是程序的基础:合理命名和类型选择是代码可读性的关键。
-
作用域决定生命周期:区分局部变量、成员变量和静态变量。
-
类型转换需谨慎:避免数据丢失或精度问题。
-
常量用
final
修饰:确保不可变,增强代码安全性。