Java 范围和块之间的区别是什么?

Java 范围和块之间的区别是什么?,java,Java,我在一本书中看到一段代码,如下所示: x = 10; if(x ==10) { // start new scope int y = 20; // known only to this block x = y * 2; } 作用域和块是否相同?作用域是可以引用变量的地方。 块定义块范围块内定义的变量将仅在该块内定义,并且在块结束后不能引用它 因此,在这段代码中,如果您尝试以下操作: x = 10; if(x ==10) { // start new scope int y = 20; // k

我在一本书中看到一段代码,如下所示:

x = 10;
if(x ==10) { // start new scope
int y = 20; // known only to this block
x = y * 2;
}

作用域和块是否相同?

作用域是可以引用变量的地方。 块定义
块范围
块内定义的变量将仅在该块内定义,并且在块结束后不能引用它

因此,在这段代码中,如果您尝试以下操作:

x = 10;
if(x ==10) { // start new scope
int y = 20; // known only to this block
x = y * 2;
}

y = 5; // error y is out of scope, not it is not defined
因为这里有一个局部范围
java中的其他类型的作用域是
类作用域
(例如,类的成员有一个类作用域,因此可以在类中的任何位置访问它)

范围的基本规则是:

  • 参数声明的范围是中方法的主体 声明中出现的
  • 局部变量声明的范围是从 声明显示在该块的末尾
  • 中出现的局部变量声明的范围 for语句头的初始化部分是 for语句和标头中的其他表达式
  • 方法或字段的作用域是类的整个主体。这 允许类的非静态方法使用字段和其他 类的方法

  • 当涉及到条件和循环时,如果不指定{},那么紧跟其后的语句是属于特定条件或循环的唯一语句

    e、 g


    它们基本上是一样的

    块是由{和}包围的代码。作用域是程序中某个事物可见的部分。据我所知,所有块都创建作用域-块中定义的任何内容在块外都不可见。反之亦然

    以下是一些没有块的作用域:

    for(int k = 0; k < 10; k++) { // k<10 and k++ are in a scope that includes k, but not in a block.
        System.out.println(k); // this is in a block (the {})
    }
    
    for(int k = 0; k < 10; k++) // k<10 and k++ are in a scope that includes k, as above
        System.out.println(k); // but there's no block!
    
    class Test {
        // this is a scope but not a block. Not entirely sure about this one.
        int x = 2;
        int y = x + 1; // I can access x here, but not outside the class, so the class must be a scope.
    }
    
    for(int k=0;k<10;k++){//k根据

    块是平衡大括号之间的一组零或多个语句,可以在允许使用单个语句的任何地方使用

    所以

    无论在块内声明了什么变量,其作用域仅限于该块。


    这有意义吗???

    oracle文档将块定义为

    块是平衡大括号之间的一组零或多个语句 并且可以在允许使用单个语句的任何地方使用

    @Mhd.Tahawi已经告诉我们什么是范围

    有一件事我要指出

    switch(something){
        case somethin1:
            line1
            line2
            break;
        case someting2:
            line3
            line4
            break;
    }
    

    行{1,2,3,4}与python不同,缩进并不意味着块

    范围
    指变量的可见性
    。换句话说,程序的哪些部分可以看到或使用它。通常,每个变量都有一个全局范围。定义后,每个p你的程序艺术可以访问一个变量

    将变量的作用域限制为单个
    函数/块
    非常有用。变量的作用域将是有限的。这样,
    函数/块
    内部的更改不会以意外方式影响主程序。

    来自:

    :

    块是一系列语句、局部类声明和 大括号内的局部变量声明语句

    声明的范围是程序的区域,其中 可以使用 简单名称,只要是可见的(§6.4.1)


    在块中,您可以声明变量。作用域定义了一个区域,在该区域中,您可以通过其简单名称访问已声明的变量。

    对于一般编程语言,块的作用域(也称为块作用域)只是一种作用域;请参阅

    有些语言,如Python,既没有块也没有块作用域(而是有函数作用域、全局作用域等)

    JavaScript和其他语言(如Java)之间的一个重要区别是,在JavaScript中,块没有作用域;只有函数有作用域。因此,如果在复合语句中使用var定义变量(例如在if控件结构中)但是,从ECMAScript 2015开始,let和const声明允许您创建块作用域变量

    给出了var的例子,以及它们与int和const的不同之处,我们可以收集到,在JavaScript中,用var声明的变量在其直接“作用域”之外是可见的,因为我们通常在其他语言中使用这个词

    在给定的示例中,在for循环中使用var声明的内容可以从函数中的任何位置获得,无论是在声明该内容的for循环之前还是之后

        // myVarVariable *is* visible out here
    
        for (var myVarVariable = 0; myVarVariable < 5; myVarVariable++) { 
          // myVarVariable is visible to the whole function 
        } 
    
        // myVarVariable *is* visible out here 
    
    //myVarVariable*在此处可见
    对于(var myVarVariable=0;myVarVariable<5;myVarVariable++){
    //myVarVariable对整个函数可见
    } 
    //myVarVariable*在这里可见
    
    这与使用let和const声明的任何内容形成对比,它们仅限于声明它们的,在很大程度上,变量仅限于其他语言中一组花括号{}的直接作用域

    这个故事的寓意是:如果你习惯了其他语言,就要小心使用var。它比你想象的更强大、更直观

    switch(something){
        case somethin1:
            line1
            line2
            break;
        case someting2:
            line3
            line4
            break;
    }
    
        // myVarVariable *is* visible out here
    
        for (var myVarVariable = 0; myVarVariable < 5; myVarVariable++) { 
          // myVarVariable is visible to the whole function 
        } 
    
        // myVarVariable *is* visible out here