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中的其他类型的作用域是
类作用域
(例如,类的成员有一个类作用域,因此可以在类中的任何位置访问它)
范围的基本规则是:
当涉及到条件和循环时,如果不指定{},那么紧跟其后的语句是属于特定条件或循环的唯一语句 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