范围和块有什么区别?

时间:2014-03-22 08:50:10

标签: java

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

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

两者,代码和块一样吗?

9 个答案:

答案 0 :(得分:13)

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

所以在这段代码中,如果你尝试类似的东西:

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中的其他类型的作用域是class scope(例如),类的成员具有类作用域,因此可以在类中的任何位置访问它。

范围的基本规则是:

  1. 参数声明的范围是方法的主体 声明出现了。
  2. 本地变量声明的范围是从该点开始的 声明出现在该块的末尾。
  3. 出现在的本地变量声明的范围 for语句的头部的初始化部分是主体 for语句和标题中的其他表达式。
  4. 方法或字段的范围是类的整个主体。这个 使类的非静态方法能够使用字段和其他方法 班级的方法。

答案 1 :(得分:7)

来自Java language specification

14.2. Blocks

  

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

6.3. Scope of a Declaration

  

声明的范围是程序的范围   声明声明的实体可以使用a来引用   简单名称,只要它是可见的(§6.4.1)。

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

答案 2 :(得分:3)

当谈到条件和循环时,如果你没有指定{}那么立即跟随语句是唯一属于特定条件或循环的语句

e.g。

x = 10;
if(x ==10) 
{ 
int y = 20; 
x = y * 2;
}
both lines get executes only if condition returns TRUE

x = 10;
if(x ==10) 
int y = 20;
x = y * 2; // this is not belong to if condition. therefore it will execute anyway

答案 3 :(得分:3)

它们大致相同。

块是由{和}包围的一些代码。范围是程序的一部分,其中某些东西是可见的。据我所知,所有块都创建了范围 - 块中定义的任何块在块外都不可见。相反的情况并非如此。

以下是一些没有块的范围:

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.
}

答案 4 :(得分:3)

根据Block

的定义
  

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

所以

{   //block started

}    //block ended

块中声明的变量是什么,范围仅限于该块。

这有意义吗?

答案 5 :(得分:3)

oracle docs将block定义为

  

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

@ Mhd.Tahawi已经告诉了范围是什么。

我应该指出一件事,

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

行{1,2,3,4}在同一范围内因此阻止,因为我没有用大括号开始和结束每个案例。与python不同,缩进并不意味着一个块

答案 6 :(得分:3)

Scope指的是visibility of variables。换句话说,程序的哪些部分可以查看或使用它。通常,每个变量都具有全局范围。一旦定义,程序的每个部分都可以访问变量。

能够将变量的范围限制为单个function/block非常有用。该变量的范围有限。这样,function/block内的更改就会以意想不到的方式影响主程序。

答案 7 :(得分:1)

来自Mozilla's A re-introduction to JavaScript (JS Tutorial)

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 

这与用let和const声明的任何内容形成对比,后者被限制在声明它们的 block 中,在很大程度上,变量被限制在单个set的立即范围内大括号{}用其他语言。

故事的寓意:如果您习惯使用其他语言,请注意var。它比您预期的要强大得多且可见。

答案 8 :(得分:0)

对于一般的编程语言,块的作用域(也称为块作用域)只是一种作用域。参见https://en.wikipedia.org/wiki/Scope_(computer_science)#Levels_of_scope

某些语言(例如Python)既没有块也没有块范围(而是具有函数范围,全局范围等)。