Java变量和对象的做用域

大多数程序设计语言都提供了“做用域”(Scope)的概念。程序员

对于在做用域里定义的名字,做用域同时决定了它的“可见性”以及“存在时间”。在C,C++和Java里,做用域是由花括号的位置决定的。编程

 

变量的做用域spa

例子:设计

 1 {
 2     int x = 12;
 3     /* only x available */
 4     {
 5         int q = 96;
 6         /* both x & q available */
 7     }
 8     /* only x available */
 9     /* q “out of scope” */
10 }

Java用一对大括号做为语句块的范围,称为做用域,做为在做用域里定义的一个变量,它只有在哪一个做用域结束以前才可以使用。code

 

在Java中不能像下面这样书写代码:对象

1 {
2     int x = 12;
3     {
4         int x = 96; /* illegal */
5     }
6 }

Java编译器会认为变量已被定义,因此做用域中的变量不能重复定义,可是在C和C++中能将一个变量“隐藏”在一个更大的做用域里,在C和C++中被容许,在Java中是不容许的,由于Java的设计者认为这样作使程序产生了混淆。blog

再来看两个例子,为了让你们看到效果这里使用截图的方式:内存

作用域

 ②get

 

咱们再来看这段代码,你们思考一个问题,第11行和第12行为何没有语法错误?代码以下:

若是咱们交换一下位置呢,代码以下:

离开做用域,变量所分配的内存空间将被JVM回收,因此语法不会有错误,而第二种写法name并无离开{}做用域,因此会语法错误。

 

上述的变量都是局部变量,那么若是是在有成员变量的状况下又是怎样一种结果呢?咱们来用代码说话,代码以下:

你们仔细的观察并结合代码思考,能够得出变量的做用域结论以下:

在同一做用域范围的包裹下成员变量名和局部变量名是能够变量名相同的,在同一个做用域范围的包裹下局部变量和局部变量不能够变量名相同(做用域内不能重复命名),在方法中使用变量的时候若是不指明使用成员变量仍是局部变量,那么默认的就是使用局部的那个变量,可是若是局部变量超出了它自己的做用域范围则会失效,被JVM垃圾回收,那么则能够重复命名此变量,并使用最新定义的这个局部变量。

 

对象的做用域

Java对象不具有与主类型同样的存在时间。用new关键字建立一个Java对象的时候,它会超出做用域的范围以外。因此倘若使用下面这段代码:

1 {
2     String s = new String("a string");
3 } /* 做用域的终点 */

那么句柄s,也就是引用会在做用域的终点处消失。然而,s指向的String对象依然占据着内存空间。在上面这段代码里,咱们没有办法继续使用这个对象,由于指向它的惟一一个句柄已经超出了做用域的边界。

这样形成的结果是:对于用new建立的对象,只要咱们愿意,它们就会一直保留下去。这个编程问题在C和C++里特别突出。在C++里遇到的麻烦最大:因为不能从语言得到任何帮助,因此在须要对象的时候,根本没法肯定它们是否可用。并且最麻烦的是,在C++里,一旦完成工做,必须保证将对象手动清除。

这样便带来了一个有趣的问题。假如 Java 让对象依然故我,怎样才能防止它们大量充斥内存,并最终形成程序的“凝固”呢。在 C++里,这个问题最令程序员头痛。但 Java 之后,状况却发生了改观。 Java 有一个特别的“垃圾收集器”,它会查找用 new 建立的全部对象,并辨别其中哪些再也不被引用。随后,它会自动释放由那些闲置对象占据的内存,以便能由新对象使用。这意味着咱们根本没必要操心内存的回收问题。只需简单地建立对象,一旦再也不须要它们,它们就会自动离去。这样作可防止在 C++里很常见的一个编程问题:因为程序员忘记释放内存形成的“内存溢出”。

 

结束语:万丈高楼平地起、冰冻三尺非一日之寒,作任何事情很难一蹴而就,大部分事情都应该善始善终。

 

可爱博主:AlanLee

博客地址:http://www.cnblogs.com/AlanLee

本文出自博客园,欢迎你们加入博客园。

相关文章
相关标签/搜索