在Java中命名两种范围

use*_*853 11 c++ java scope

我在命名我在Java中看到的两种范围时遇到了困难:

class Fun {
    int f = 1;
    void fun() {
        int f = 2;
        while(true){
            int f = 3;
            int g = 1;
        }
        int g = 2;
    }
}
Run Code Online (Sandbox Code Playgroud)

案件主要是f = 3g = 2;

一个while语句不引入新的范围,所以我不能创建一个名为而局部变量f.但是如果我创建一个名为的局部变量,g那么我可以在循环之后"重新创建"它.为什么?我知道它不再可访问,但如果编译器检查可访问性,那么它几乎检查范围.

所以我想知道这里的交易是什么,这些概念叫做什么?它与C++中的相同吗?


我只是设法安装g ++并自己试了一下:

#include <iostream>
using namespace std;

int main(){
    int f = 0;
    for(int i=0; i<1; i++){
        int f = 1;
        cout << f << endl;
        {
            int f = 2;
            cout << f << endl;
        }
    }
    cout << f << endl;
}
Run Code Online (Sandbox Code Playgroud)

显然,C++平等对待所有范围!

Tim*_*m B 5

一旦你离开了{}循环,你离开它时就会超出范围.然后再次申报g是有效的.

局部变量仅在声明它们的块的持续时间内.

进一步详细说明:

  • 第一个f是对象范围.它始终可以从物体进入.
  • 第二个f是本地范围.您可以使用它来访问它f,您仍然可以f使用访问对象范围this.f.
  • 第三个f是尝试创建第二个本地范围f.那是无效的.

  • 第一个g是创建本地范围g.

  • 第二个g是创建第二个局部范围,g但第一个范围已经超出范围并消失.

所以唯一无效的声明是第三个f.

存在第三种类型的范围,其中声明了静态变量 - 这些是在类的每个实例之间共享的变量.

类型有许多名称,一些最常见的是局部变量,实例变量(也称为字段)和类变量(也称为静态字段).您还有方法参数,但这只是获取局部变量的另一种方式.

进一步阅读: