本文带你从0到1掌握Java变量的核心知识:变量定义、命名规范、三大作用域(类变量/实例变量/局部变量)及常量用法,附完整代码示例和高频面试题,看完就能上手写代码、应对求职~
一、变量是什么?
变量就是可以变化的量,是Java程序中最基本的存储单元。
- Java是强类型语言:每个变量必须先声明类型,才能使用。
- 变量三要素:变量名 、变量类型 、作用域。
变量声明语法
java
// 基础格式:数据类型 变量名 = 初始值;
type varName [= value];
// 同类型多变量声明(逗号分隔)
type varName1 = value1, varName2 = value2;
注意事项
- 类型可以是基本类型 (如int、float)或引用类型(如String、自定义类)。
- 变量名必须是合法标识符(不能以数字开头,不能是关键字)。
- 变量声明是完整语句,必须以分号
;结尾。
代码示例
java
public class VariableDemo {
public static void main(String[] args) {
// 基本类型变量
int age = 18;
double score = 95.5;
// 引用类型变量
String name = "张三";
// 同类型多变量声明
int a = 10, b = 20, c = 30;
System.out.println(age);
System.out.println(name);
}
}
二、变量命名规范(阿里巴巴开发规范推荐)
命名要见名知意,遵循驼峰原则,不同类型有不同约定:
| 类型 | 规范 | 示例 |
|---|---|---|
| 类成员变量 | 首字母小写 + 驼峰原则 | monthSalary、userName |
| 局部变量 | 首字母小写 + 驼峰原则 | count、totalPrice |
| 常量 | 全大写 + 下划线分隔 | MAX_VALUE、DEFAULT_SIZE |
| 类名 | 首字母大写 + 驼峰原则 | Student、GoodMan |
| 方法名 | 首字母小写 + 驼峰原则 | run()、getUserName() |
✅ 禁止使用拼音、特殊字符,不要用
$开头,避免与编译器生成的类名冲突。
三、变量作用域:三大变量类型详解
根据声明位置不同,变量分为类变量 、实例变量 、局部变量,作用域和生命周期各不相同。
1. 类变量(静态变量)
- 声明位置:类内部、方法外部 ,带
static修饰。 - 作用域:整个类生效,随类加载而加载,无需创建对象即可访问。
- 初始值:有默认初始值(如int默认0,String默认null)。
2. 实例变量(成员变量)
- 声明位置:类内部、方法外部 ,不带
static修饰。 - 作用域:依赖对象实例,必须创建对象后才能访问。
- 初始值:有默认初始值(如int默认0,boolean默认false)。
3. 局部变量
- 声明位置:方法内部/代码块内部。
- 作用域:仅在当前方法/代码块内有效,出了范围就无法访问。
- 初始值:必须手动初始化,否则编译报错(无默认值)。
完整代码示例
java
public class VariableScopeDemo {
// 1. 类变量(静态变量):static修饰
public static int allClicks = 0;
// 2. 实例变量(成员变量):无static修饰
public String str = "hello world";
private int age; // 有默认值0
public void method() {
// 3. 局部变量:必须手动初始化
int i = 0; // 必须赋值,否则编译报错
System.out.println("局部变量i:" + i);
// 访问类变量(直接访问)
allClicks++;
System.out.println("类变量allClicks:" + allClicks);
// 访问实例变量(需要通过this,或对象访问)
System.out.println("实例变量str:" + this.str);
System.out.println("实例变量age:" + this.age);
}
public static void main(String[] args) {
// 访问类变量:类名.变量名
System.out.println("类变量allClicks:" + VariableScopeDemo.allClicks);
// 访问实例变量:必须创建对象
VariableScopeDemo demo = new VariableScopeDemo();
System.out.println("实例变量str:" + demo.str);
// 调用方法,使用局部变量
demo.method();
}
}
四、常量:不可变的变量
常量是值不可修改 的变量,用final修饰。
- 命名规范:全大写 + 下划线分隔(如
MAX_VALUE)。 - 声明格式:
final 数据类型 常量名 = 常量值; - 特点:一旦赋值,不能再修改;必须在声明时或构造器中初始化。
代码示例
java
public class ConstantDemo {
// 静态常量(类常量):static final 修饰
public static final double PI = 3.1415926;
// 实例常量
private final int MAX_AGE = 120;
public static void main(String[] args) {
// 访问静态常量
System.out.println("圆周率PI:" + ConstantDemo.PI);
// 尝试修改常量:编译报错
// ConstantDemo.PI = 3.14; // 错误!常量不可修改
ConstantDemo demo = new ConstantDemo();
System.out.println("最大年龄MAX_AGE:" + demo.MAX_AGE);
// demo.MAX_AGE = 130; // 错误!实例常量也不可修改
}
}
五、速记总结表(一眼看懂)
| 变量类型 | 修饰符 | 声明位置 | 作用域 | 初始值 | 访问方式 |
|---|---|---|---|---|---|
| 类变量 | static |
类内、方法外 | 整个类 | 有默认值 | 类名.变量名 / 对象.变量名 |
| 实例变量 | 无 | 类内、方法外 | 依赖对象 | 有默认值 | 对象.变量名 |
| 局部变量 | 无 | 方法/代码块内 | 当前方法/代码块 | 无,必须手动初始化 | 方法内直接访问 |
| 常量 | final |
类内/方法内 | 声明范围 | 必须手动初始化 | 同对应变量类型 |
六、高频易错点总结
- 局部变量必须初始化:否则编译报错,类变量和实例变量有默认值。
- 常量不可修改 :
final修饰后,赋值后不能再改变。 - 命名规范:见名知意,驼峰原则,常量全大写。
- 作用域冲突:局部变量和实例变量同名时,局部变量优先(就近原则)。
作用域冲突示例
java
public class ScopeConflictDemo {
private int num = 100; // 实例变量
public void printNum() {
int num = 200; // 局部变量,与实例变量同名
System.out.println(num); // 输出200(就近原则,优先局部变量)
System.out.println(this.num); // 输出100(通过this访问实例变量)
}
public static void main(String[] args) {
ScopeConflictDemo demo = new ScopeConflictDemo();
demo.printNum();
}
}
七、高频面试题(附标准答案)
1. Java中变量按作用域分为哪几类?各有什么特点?
标准答案:
- 类变量(静态变量) :
static修饰,类内方法外,随类加载,全局有效,有默认值,可通过类名直接访问。 - 实例变量(成员变量) :无
static,类内方法外,依赖对象,对象创建后生效,有默认值,需通过对象访问。 - 局部变量 :方法/代码块内,仅在当前范围有效,无默认值必须手动初始化,生命周期随方法/代码块结束而销毁。
2. 局部变量为什么必须手动初始化?类变量和实例变量为什么不需要?
标准答案:
- 局部变量存于栈内存,Java虚拟机不会自动赋默认值,若未初始化就使用,会导致不可预测的内存值,因此编译期强制要求初始化。
- 类变量和实例变量存于堆内存,对象/类创建时JVM会自动赋默认值(如int=0、String=null),保证变量安全可用。
3. final修饰的变量有什么特点?和常量的关系?
标准答案:
final修饰的变量一旦赋值就不能修改,必须在声明时或构造器中初始化。- 常量通常指
static final修饰的类常量,是全局不可变的值;final也可修饰局部变量、实例变量,本质是"只读变量"。
4. 类变量和实例变量的生命周期区别?
标准答案:
- 类变量:随类加载 而创建,随类卸载而销毁,生命周期与类一致。
- 实例变量:随对象创建 而创建,随对象被GC回收而销毁,生命周期与对象一致。
5. 变量命名时,int a=10;和int age=10;哪个更好?为什么?
标准答案 :
int age=10;更好,因为遵循见名知意 原则,age能清晰表达变量含义,a过于模糊,不利于代码阅读和维护。
6. 局部变量和实例变量同名时,如何访问实例变量?
标准答案 :
使用this.变量名访问实例变量,this代表当前对象实例,可明确指定访问实例变量而非局部变量。
结语
变量是Java编程的基石,掌握变量的定义、命名、作用域和常量用法,是后续学习方法、类和对象的基础。建议大家亲手敲一遍代码,结合面试题理解核心考点,既能夯实基础,又能应对求职~