首页 > 编程笔记

Java成员变量和局部变量详解

我们知道变量是 Java 程序中表示数据的基本单位,两个变量之间除了数据类型、变量名和变量值这些内容不同之外,变量的作用域范围也是不同的。

所谓变量的作用域,指的是程序中可以通过变量名来访问该变量的范围。变量的作用域由变量被声明时所在的位置决定,Java 中根据不同的作用域可以将变量分为成员变量和局部变量。

如何判断一个变量是成员变量还是局部变量?很简单,根据该变量的声明位置即可得出结论,如果一个变量在方法中声明,则该变量为局部变量。如果一个变量在方法外,在类中声明,则该变量为成员变量,如下图所示。


图 1 成员变量和局部变量

成员变量和局部变量的作用域有什么区别呢?成员变量的作用域在整个类中,类中的每个方法中都可以访问该变量。局部变量的作用域只在定义该变量的方法中,出了方法体就无法访问,如下图所示。


图 2 成员变量和局部变量的区别

在 show 方法中,name 和 num 都可以访问,而在 show2 方法中,name 可以访问而 num 不能访问。因为 name 是成员变量,Test 类的每个方法都可以访问该变量。num 在 show 方法中定义,是局部变量,作用域仅局限在 show 方法中,一旦出了 show 方法就无法访问。

例子,下列代码的运行结果是什么?
public class Test {
    int num = 9;
    public void show(){
        int num = 10;
        System.out.println(num);
    }
    public static void main(String[] args) {
        Test test = new Test();
        test.show();
    }
}
运行结果为:

10

当成员变量和局部变量重名时,局部变量的优先级更高。这里特别说明一下,Java 程序运行的入口是 main 方法,每个类都可以定义 main 方法,即每个类都可以作为 Java 程序运行的入口,要调用类中的方法,就必须首先实例化类的对象,然后通过对象来调用方法,例如“test.show();”。

现在我们对代码进行修改,代码如下:
public class Test {
    int num = 9;
    public void show(){
        int num = 10;
        System.out.println(this.num);
    }
    public static void main(String[] args) {
        Test test = new Test();
        test.show();
    }
}
此时,调用 show 方法的运行结果是 9,this 指当前类的实例化对象,所以 this.mum 访问的是当前类的成员变量 num,作用域是整个类,而非局部变量 num。

成员变量和局部变量除了作用域不同之外,它们的初始值也不同。Java 会给成员变量赋初始值,局部变量则不会赋初始值,不同类型的成员变量的初始值不同,举个简单的例子:
public class Test {
    String name;
    int num;
    public void show(){
        int num1;
        System.out.println(name);
        System.out.println(this.num);
        //System.out.println(num1); // 报错,提示 num1 没有初值
    }
    public static void main(String[] args) {
        Test test = new Test();
        test.show();
    }
}
运行结果为:

null
0

推荐阅读