變量的作用域受代碼塊限制嗎?
大多數(shù)過程型語言都有作用域(scope)的概念。作用域決定了在其內(nèi)定義的變量名的可見性和生命周期。在C、C++和Java中,作用去由花括號(hào)的位置決定。在定義域中定義的變量只可用于作用域結(jié)束之前。可以正常輸出,但是如果我們交換順序,就會(huì)報(bào)錯(cuò)。
實(shí)際上以上代碼在C和C++中是合法的,但是在Java中卻不可以這樣寫,編譯器會(huì)報(bào)告變量x已經(jīng)定義過。所以,在C和C++里將一個(gè)較大的作用域的變量“隱藏”起來的做法,在Java中是不允許的。因?yàn)镴ava設(shè)計(jì)者認(rèn)為這樣會(huì)導(dǎo)致程序混亂。
Java中:
第一種寫法:先定義了代碼塊局部變量后定義方法局部變量,代碼塊局部變量x只能作用于定義它的代碼塊,也就是說出了代碼塊該x就被銷毀了,所以后來再定義一個(gè)方法局部變量是可以的。
第二種寫法:先定義了方法局部變量后定義了代碼塊局部變量,方法局部變量的作用域是整個(gè)方法,出了該方法后這個(gè)方法局部變量才被銷毀,此例中,在方法局部變量還未被銷毀時(shí)就定義了相同名字的代碼塊局部變量,所以被視為重復(fù)定義。引用s在作用域的終點(diǎn)就消失了,然而,s指向的String對(duì)象仍繼續(xù)占據(jù)內(nèi)存空間。Java神奇之處在于有一個(gè)垃圾回收器,用來監(jiān)視new創(chuàng)建的所有對(duì)象,并辨別那些不會(huì)再被引用的對(duì)象。隨后,釋放這些對(duì)象的內(nèi)存空間,以便提供其他對(duì)象使用。