了解Java中的变量范围

204 阅读3分钟

你在Java应用程序中使用的每个变量都会有一个不同的变量范围,这取决于你在哪里创建该变量。

然后,变量作用域决定了你可以从哪里访问你的变量。

本教程将帮助你了解Java中三种不同的变量作用域:

  • 类级作用域
  • 方法级作用域
  • 块级作用域

让我们从学习类级作用域开始。

类级变量作用域

你在类内声明但在其方法之外的变量被称为实例变量。这些变量是类级作用域,可以被该类的方法访问。

例如,假设你有一个Cat 类,里面初始化了name 变量:

public class Cat {
String name = "cat";
}

那么类中的方法就可以调用name 变量,并给它分配一个新值。

看一下下面的例子:

public class Cat {
String name = "cat";
public void hello(){
 System.out.println(name + " says hello!");
 }
public void setName(String newName){
 name = newName;
 }
}

上面的两个方法都是有效的,在它们的执行中会使用你在class 声明下面初始化的name 变量。

Java中的变量也必须在后续调用使用或重新赋值变量之前进行声明或初始化:

public class Cat {
System.out.println(name + " says hello!");
// or
 name = "Tom";
// both cause error: Can't resolve symbol name
 String name = "cat";
}

现在你知道了类级变量范围,让我们继续学习方法级变量范围。

方法级的变量作用域

你在方法中声明或初始化的变量被称为局部变量,它们将具有方法级范围。

这意味着这些变量只能在你创建的方法中访问。

假设你在Cat 类中有以下size() 方法:

public class Cat {
String name = "cat";
public void size(){
double length = 1.5;
System.out.println("Body length is "+ length);
}
}

那么在size() 方法中声明的length 变量就不能在该方法之外的任何地方被访问。

假设你有第二个方法叫sleep() ,它将把猫的长度增加到2 ,如下所示:

public class Cat {
String name = "cat";
public void size(){
double length = 1.5;
System.out.println("Body length is "+ length);
}
public void sleep(){
 length = 2;
 // ^ error: Can't resolve symbol length
 }
}

上面sleep() 方法内的length 变量赋值将导致一个错误。你需要在sleep() 方法中再次声明这个变量:

public class Cat {
String name = "cat";
public void size(){
double length = 1.5;
System.out.println("Body length is "+ length);
}
public void sleep(){
 double length = 1.5;
 length = 2;
}
}

或者在类中声明length 变量,而不是在方法中声明:

public class Cat {
String name = "cat";
 double length = 1.5;

public void size(){
System.out.println("Body length is "+ length);
}
public void sleep(){
length = 2;
}
}

块级变量范围

你在某个括号内声明的变量{} 将具有块级范围,只能在该括号内访问。

例如,当你写一个for 循环语句时,你可能会看到一个块级变量:

for (int i = 0; i < 5; i++) {
System.out.println(i);
}

上面的整数i ,不能在for 循环之外被访问。

在Java中,你可以随时通过在方法或类内创建另一个括号来声明一个额外的块。在括号内创建的变量将具有块级范围。

下面是一个在方法内部创建块的例子:

public class Cat {
public void changeName(){
{
String name = "cat";
}
name = "Tom";
// ^ error: Can't resolve symbol length
 }
}

如果你仔细考虑前面的作用域,你可能会开始注意到在一个块作用域中声明的Java变量可以从内部作用域访问,但不能从外部作用域访问。

例如,在类块中创建的变量可以被内部方法块访问:

public class Cat {
String name = "cat";
public void hello(){
System.out.println(name + " says hello!");
}
}

但是一个方法变量不能被外部的类块访问:

public class Cat {
public void hello(){
String name = "cat";
}
name = "Tom"
}

当你把类和方法的关键字从屏幕上移开时,你会看到类和方法级别的作用域都只是用括号{} 来改变变量的作用域。

{ // public class Cat
 { // public void hello()
 String name = "cat";
}
name = "Tom"
}

这意味着类级和方法级作用域实际上也都是块作用域。

总结

现在你已经了解了Java中的变量作用域,是时候了解Java访问修饰符了,它决定了你是否可以从它的包之外访问某些变量。