← Backend / Java

11_Java 变量类型

Java 局部变量、实例变量、静态变量、参数变量的声明与使用

在 Java 语言中,所有的变量在使用前必须声明。 声明变量的基本格式如下:

type identifier [ = value][, identifier [= value] ...] ;

格式说明:

  • type -- 数据类型。
  • identifier -- 是变量名,可以使用逗号 , 隔开来声明多个同类型变量。

以下列出了一些变量的声明实例。注意有些包含了初始化过程。

int a, b, c;         // 声明三个int型整数:a、 b、c
int d = 3, e = 4, f = 5; // 声明三个整数并赋予初值
byte z = 22;         // 声明并初始化 z
String s = "example";  // 声明并初始化字符串 s
double pi = 3.14159; // 声明了双精度浮点型变量 pi
char x = 'x';        // 声明变量 x 的值是字符 'x'。

Java 语言支持的变量类型有:

  • 局部变量(Local Variables): 局部变量是在方法、构造函数或块内部声明的变量,它们在声明的方法、构造函数或块执行结束后被销毁,局部变量在声明时需要初始化,否则会导致编译错误。
    public void exampleMethod() {
        int localVar = 10; // 局部变量
        // ...
    }
  • 实例变量(Instance Variables): 实例变量是在类中声明,但在方法、构造函数或块之外,它们属于类的实例,每个类的实例都有自己的副本,如果不明确初始化,实例变量会被赋予默认值(数值类型为0,boolean类型为false,对象引用类型为null)。
    
    public class ExampleClass {
        int instanceVar; // 实例变量
    }
    
  • 静态变量或类变量(Class Variables): 类变量是在类中用 static 关键字声明的变量,它们属于类而不是实例,所有该类的实例共享同一个类变量的值,类变量在类加载时被初始化,而且只初始化一次。
    
    public class ExampleClass {
        static int classVar; // 类变量
    }
    
  • 参数变量(Parameters): 参数是方法或构造函数声明中的变量,用于接收调用该方法或构造函数时传递的值,参数变量的作用域只限于方法内部。
      
      public void exampleMethod(int parameterVar) {
          // 参数变量
          // ...
      }
      
    

以下实例中定义了一个 VariableDemo 类,其中包含了一个成员变量 instanceVar 和一个静态变量 staticVar。

method() 方法中定义了一个参数变量 paramVar 和一个局部变量 localVar。在方法内部,我们将局部变量的值赋给成员变量,将参数变量的值赋给静态变量,然后打印出这些变量的值。

在 main() 方法中,我们创建了一个 VariableDemo 对象,并调用了它的 method() 方法。

public class VariableDemo {
    // 成员变量
    private int instanceVar;
    // 静态变量
    private static int staticVar;
    
    public void method(int paramVar) {
        // 局部变量
        int localVar = 10;
        
        // 使用变量
        instanceVar = localVar;
        staticVar = paramVar;
        
        System.out.println("成员变量: " + instanceVar);
        System.out.println("静态变量: " + staticVar);
        System.out.println("参数变量: " + paramVar);
        System.out.println("局部变量: " + localVar);
    }
    
    public static void main(String[] args) {
        VariableDemo v = new VariableDemo();
        v.method(20);
    }
}

运行以上代码,输出如下:

成员变量: 10
静态变量: 20
参数变量: 20
局部变量: 10

var 类型推断(Java 10+)

Java 10 新增 var 关键字,编译器根据初始化表达式自动推断局部变量类型,减少冗余代码:

// 传统写法
ArrayList<String> list = new ArrayList<String>();
Map<String, Integer> scores = new HashMap<>();

// var 写法
var list = new ArrayList<String>();
var scores = new HashMap<String, Integer>();

// 增强 for 循环中使用
for (var item : list) {
    System.out.println(item.toUpperCase());
}

限制: var 只能用于局部变量,不能用于实例变量、静态变量、方法参数或返回类型。

public class Demo {
    var x = 10;        // ❌ 编译错误!不能用于成员变量

    public var foo() { // ❌ 编译错误!不能用于返回类型
        var local = 5; // ✅ 合法,局部变量
        return local;
    }
}

变量作用域与遮蔽

变量的作用域决定了它在哪里可以被访问:

public class ScopeDemo {
    int x = 10;                 // 实例变量,作用域:整个类

    public void method() {
        int x = 20;             // 局部变量,遮蔽(shadow)实例变量 x
        System.out.println(x);        // 20(局部变量优先)
        System.out.println(this.x);   // 10(用 this 访问被遮蔽的实例变量)

        {
            int y = 30;         // 块内局部变量
            System.out.println(y);    // 30
        }
        // System.out.println(y);  // ❌ 编译错误!y 超出了块的作用域
    }
}

变量类型速查

类型 声明位置 生命周期 默认值 访问方式
局部变量 方法 / 代码块内 方法执行结束即销毁 无(必须显式初始化) 直接访问
实例变量 类中,方法外 对象存活期间 有(0 / false / null) 对象.变量名
静态变量 类中,static 修饰 类加载到程序结束 有 类名.变量名
参数变量 方法声明括号内 方法执行期间 由调用方传入 直接访问