【Java 基础】变量全解:定义、命名规范、作用域与常量(附代码示例+面试题)

本文带你从0到1掌握Java变量的核心知识:变量定义、命名规范、三大作用域(类变量/实例变量/局部变量)及常量用法,附完整代码示例和高频面试题,看完就能上手写代码、应对求职~


一、变量是什么?

变量就是可以变化的量,是Java程序中最基本的存储单元。

  • Java是强类型语言:每个变量必须先声明类型,才能使用。
  • 变量三要素:变量名变量类型作用域

变量声明语法

java 复制代码
// 基础格式:数据类型 变量名 = 初始值;
type varName [= value];

// 同类型多变量声明(逗号分隔)
type varName1 = value1, varName2 = value2;

注意事项

  1. 类型可以是基本类型 (如int、float)或引用类型(如String、自定义类)。
  2. 变量名必须是合法标识符(不能以数字开头,不能是关键字)。
  3. 变量声明是完整语句,必须以分号 ; 结尾。

代码示例

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);
    }
}

二、变量命名规范(阿里巴巴开发规范推荐)

命名要见名知意,遵循驼峰原则,不同类型有不同约定:

类型 规范 示例
类成员变量 首字母小写 + 驼峰原则 monthSalaryuserName
局部变量 首字母小写 + 驼峰原则 counttotalPrice
常量 全大写 + 下划线分隔 MAX_VALUEDEFAULT_SIZE
类名 首字母大写 + 驼峰原则 StudentGoodMan
方法名 首字母小写 + 驼峰原则 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 类内/方法内 声明范围 必须手动初始化 同对应变量类型

六、高频易错点总结

  1. 局部变量必须初始化:否则编译报错,类变量和实例变量有默认值。
  2. 常量不可修改final修饰后,赋值后不能再改变。
  3. 命名规范:见名知意,驼峰原则,常量全大写。
  4. 作用域冲突:局部变量和实例变量同名时,局部变量优先(就近原则)。

作用域冲突示例

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编程的基石,掌握变量的定义、命名、作用域和常量用法,是后续学习方法、类和对象的基础。建议大家亲手敲一遍代码,结合面试题理解核心考点,既能夯实基础,又能应对求职~

相关推荐
mldlds1 小时前
【异常解决】Unable to start embedded Tomcat Nacos 启动报错
java·tomcat
代码探秘者1 小时前
【Java】final、finally、finalize 区别
java·开发语言
代码探秘者2 小时前
【Java】浅拷贝 VS 深拷贝:核心差异 + 实现方式 + 避坑指南
java·开发语言
盐水冰2 小时前
【Redis】学习(3)Redis的Java客户端
java·redis·学习
阿星仔6662 小时前
claude code switch安装使用指南:一键切换多Claude API
java
weixin199701080162 小时前
淘宝客商品详情页前端性能优化实战
java·前端·python·性能优化
程途知微2 小时前
Java 内存模型 (JMM) 与 volatile 底层实现
java·后端
何中应2 小时前
IDEA中三个很方便的设置
java·ide·intellij-idea