java变量作用域Scope

一、变量Scope

作用域同时决定了它的“可见性”以及“存在时间”。在C,C++和Java里,作用域是由花括号的位置决定的。变量的作用域分为四个级别:类级、对象实例级、方法级、块级。

二、类级Scope

类级变量又称全局级变量或静态变量,需要使用static关键字修饰。类级变量在类定义后就已经存在,占用内存空间,可以通过类名来访问,不需要实例化。

package testdemo;
/**
 *
 * @author MK
 */
public class TestDemo {

    //类变量
    public static int classVariable;

}

三、对象实例级Scope

对象实例级变量就是成员变量,实例化后才会分配内存空间,才能访问。

package testdemo;
/**
 *
 * @author MK
 */
public class TestDemo {

    //实例变量
    public int instanceVariable;

}

四、方法级Scope

方法级变量就是在方法内部定义的变量,就是局部变量。

package testdemo;
/**
 *
 * @author MK
 */
public class TestDemo {

    /**
     * 静态方法
     */
    public static void staticMethod() {
        int localVariable=0;
    }
    /**
     * 实例方法
     */
    public  void instanceMethod() {
        int localVariable=0;
    }
}

五、块级Scope

块级变量就是定义在一个块内部的变量,变量的生存周期就是这个块,出了这个块就消失了,比如 if、for、while 语句的块。块是指由大括号包围的代码。

package testdemo;

/**
 *
 * @author MK
 */
public class TestDemo {

    /**
     * 实例代码块
     */
    {
        int localVariable = 0;
    }

    /**
     * 静态代码块
     */
    static {
        int localVariable = 0;
    }

    /**
     * 静态方法
     */
    public static void staticMethod() {
        {
            int localVariable = 0;
        }
    }

    /**
     * 实例方法
     */
    public void instanceMethod() {
        if (12 > 0) {
            int localVariable = 0;
        }
    }
}

注意:

1、正确

package testdemo;

/**
 *
 * @author MK
 */
public class TestDemo {

    int variable=0;
    /**
     * 实例方法
     */
    public void instanceMethod() {
        
      int variable = 0;
        
    }
}

2、正确

package testdemo;

/**
 *
 * @author MK
 */
public class TestDemo {

    int variable=0;
    /**
     * 实例方法
     */
    public void instanceMethod() {
         {
            int variable = 0;
        }
    }
}

3、错误,两个局部变量作用域相交,这与c/c++的局部变量隐藏不一样

package testdemo;

/**
 *
 * @author MK
 */
public class TestDemo {

    int variable=0;
    /**
     * 实例方法
     */
    public void instanceMethod() {
        
      int variable = 0;
      {
          int variable = 0;//错误
      }  
    }
}

4、正确

package testdemo;

/**
 *
 * @author MK
 */
public class TestDemo {

    int variable=0;
    /**
     * 实例方法
     */
    public void instanceMethod() {
        
     
      {
          int variable = 0;
      } 
      
       int variable = 0;
    }
}

总结:

(1)在同一作用域范围的包裹下成员变量名和局部变量名是可以变量名相同的。

(2)在同一个作用域范围的包裹下局部变量和局部变量不可以变量名相同(作用域内不能重复命名)。

(3)在方法中使用变量的时候如果不指明使用成员变量还是局部变量,那么默认的就是使用局部的那个变量,但是如果局部变量超出了它本身的作用域范围则会失效,被JVM垃圾回收,那么则可以重复命名此变量,并使用最新定义的这个局部变量。