Java变量作用域

时间:2019-04-29 03:17:56  来源:igfitidea点击:

许多编译器错误都是由于程序员对变量的可用时间以及何时可以访问这些变量没有清晰的印象而产生的。变量作用域概念描述了变量定义后的生命周期或其可用区域。

为了理解这个主题,让我们考虑一个例子:

class Student{

  public static int noStudents = 0;  //静态类变量

  public int age;              //实例变量

  public int[] marks;     //实例变量

  public Student()

  {

      noStudents++;   //访问静态变量

      this.age = 0;

      marks = new int[10];

  }

  public float getAverage()

  {

      float sum = 0;    //局部变量

      for(int i = 0;i < marks.length;)

      {   //i 是for块中的局部变量

          sum+=marks[i];

          i++;

      }

      return sum/marks.length;

  }

}

public class Main{

	public static void main(String[] args)

      {

          Student s1 = new Student();

          Student s2 = new Student();

          // 访问静态变量

          System.out.println("The are "+Student.noStudents+" students");

	}

}

每种类型的变量都有自己的范围:

实例变量(属性)--这些变量是对象的一部分,因此,它们是在对象被创建时创建的;它们一直存在到对象被创建;对象及其方法可以访问其实例变量;

静态变量——这些变量是类的一部分,在JVM加载类时创建;

方法局部变量-这些变量定义在方法堆栈上,只要方法被执行就存在(放在调用堆栈上);即使局部变量可以访问,也不能从嵌套方法()中使用它们;

块变量-这些变量定义在代码块(在{和}之间)内,可以在执行块时使用;典型的代码块用于初始化块。

关于变量作用域的常见错误是什么-找不到符号编译器错误

当我们尝试使用块外的块变量时,将生成 [找不到符号编译器错误Cannot find symbol]:

public float getAverage()

  {

      float sum = 0;    //局部变量

      for(int i = 0;i < marks.length;)

      {   //i 是for块中的局部变量

          sum+=marks[i];

          i++;

      }

	  //编译错误:Cannot find symbol 

      i = 0; 

      return sum/marks.length;

  }

另一种情况是,当我们试图从嵌套方法访问方法局部变量时,我们将无法找到符号编译器错误:

public static void DoSomething()

  {

    int variable = 0;       //局部变量

    DoSomethingElse();	    //嵌套方法

  }

  public static void DoSomethingElse()

  {

	// 编译错误:Cannot find symbol 

      variable++; 

  }

当我们试图从静态上下文访问实例变量或方法时,我们会得到相同的错误,比如 main方法。

public static void main(String[] args)

{

    Student s1 = new Student();

    Student s2 = new Student();

    // 访问静态变量

    System.out.println("The are "+Student.noStudents+" students");

    // 编译错误:Cannot find symbol

    age = 23;         //COMPILER ERROR

    getAverage();     //COMPILER ERROR 

}