您的位置:首页 > 编程语言 > Java开发

java的基本语言元素--代码块

2017-10-16 14:46 260 查看
语句同样是Java重要的基础语言要素之一,那么在Java中语句是以什么形式体现的呢?通常分为:
简单语句:就如同语文中以句号“。”结尾的一个句子就是一句语句一样,Java中以分号“;”结尾的一段代码就是最基本的一条Java语句。
块(复合)语句:指以一对花括号"{ }"包含起来的一系列程序语句的集合,所以又被称为复合语句。

提到块语句,我们就不得不提及与之紧密相关的一个名词:代码块。

代码块实际上也可以理解为作用域,之所以这样讲,是因为我们已经说过了代码块是以花括号“{ }”包含起来的一系列语句。

而块定义了变量的使用范围,各个块之间可以进行嵌套,而在块中声明的变量,只在当前块当中有效,在块以外将无法使用。

所以说,在使用代码块的时候,需要十分注意的两点就是:
注意变量的作用范围,不要在无效范围中使用该变量,否则程序将编译失败。
不要在嵌套的两个块中,声明使用相同标示符的变量,否则也将导致程序编译失败。

那么,首先我们来看第一个注意点:



在这段代码中,值得我们注意的是:
一个完整的Java程序(类)实际上正是由一个个嵌套的代码块组合起来的。就像在类声明后用花括号包含起来的代码块被称为类代码块,方法声明后包含的代码块被称为方法代码块,嵌套在方法内的代码块被称为局部代码块等等一样。
嵌套在更内部层次的代码块可以使用嵌套外部的代码块中的内容,但位于嵌套更外部层次的代码块不能使用更内部层次的代码块中的内容。所以在上面的例子中我们看到,方法代码块中可以使用类代码块中声明的变量;局部代码块中,在类代码块和方法代码快中声明的变量都能够被访问;但最后想要在方法代码块中访问局部代码块中声明的变量,程序就编译失败了。这一切现象出现的原因,正是因为:在块中声明的变量只在当前块中有效。
合理的使用代码块,可以在一定程度上节约内存开销。这是因为之所以说块中声明的变量只在当前块中有效,深入的讲,实际就是因为代码块限定了其生命周期,也就是说当虚拟机执行到该代码块,当中声明的变量才会被加载到内存之中,而随着该代码块的代码都执行完毕,当中的变量就会在内存中被释放,所以自然在块以外就无法再访问到了。

接着,我们来看第二个注意点:



注意以上代码截图中,用红色方框标记的两行代码。

我们写这段代码想要验证的是代码块的特性之一:不要在嵌套的两个代码块中声明相同命名的变量。

那么,第二个红框标注的代码恰恰印证了这一点,在方法代码块中声明了名为“method_block_var”的变量之后,如果再在其嵌套的局部代码块中声明,就会导致编译出错。

但让人在意的是,我们在类代码块中声明了一个“class_block_var”的变量,为何之后我们在其嵌套的方法代码块中,仍然可以声明相同命名的变量呢?

这实际上涉及到Java的内存机制,首先我们需要知道的就是:Java中声明在类代码块中的变量被称为该类的成员变量,而声明在方法或局部代码块中的变量被称为局部变量。

之所以造成这样的现象,究其根本是因为虚拟机内部的内存结构对于成员变量和局部变量的存储位置是不同的:

类的成员变量会随着类的对象一起,被存储在内存当中的堆内存当中;而局部变量则会随着方法的加载,而被存储到栈内存当中(方法的压栈)。

到了这里就不难理解了:

1.不同的两个班级:一班(堆内存)和二班(栈内存)中,都有一个名为“ 小明”的同学(变量)。这样的情况是没有任何问题的,因为你在调用时,可以通过“一班的小明”和“二班的小明”来正确的调用到目标学生。Java中也是这样的,在对成员变量进行调用时,实际上是隐式的调用了当前类对象关键字this。也就是说对成员变量的调用实际上是以:this.var的形式进行调用的,这就很好的与局部变量调用区分开了。

2.但同一个班级中(都位于栈内存)有两个相同名字的学生 ,那么再想要正确的调用目标学生就很难了,这会产生“调用的不确定性”。所以自然的,Java作为一门严谨的具有高度健壮性的语言,自然不会允许这样的“危险因素”存在。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 代码块