java的基本語言元素--代碼塊

語句同樣是Java重要的基礎語言要素之一,那麼在Java中語句是以什麼形式體現的呢?通常分爲:

  • 簡單語句:就如同語文中以句號“。”結尾的一個句子就是一句語句一樣,Java中以分號“;”結尾的一段代碼就是最基本的一條Java語句。
  • 塊(複合)語句:指以一對花括號"{ }"包含起來的一系列程序語句的集合,所以又被稱爲複合語句。


提到塊語句,我們就不得不提及與之緊密相關的一個名詞:代碼塊。

代碼塊實際上也可以理解爲作用域,之所以這樣講,是因爲我們已經說過了代碼塊是以花括號“{ }”包含起來的一系列語句。

而塊定義了變量的使用範圍,各個塊之間可以進行嵌套,而在塊中聲明的變量,只在當前塊當中有效,在塊以外將無法使用。

所以說,在使用代碼塊的時候,需要十分注意的兩點就是:

  • 注意變量的作用範圍,不要在無效範圍中使用該變量,否則程序將編譯失敗。
  • 不要在嵌套的兩個塊中,聲明使用相同標示符的變量,否則也將導致程序編譯失敗。


那麼,首先我們來看第一個注意點:

在這段代碼中,值得我們注意的是:

  • 一個完整的Java程序(類)實際上正是由一個個嵌套的代碼塊組合起來的。就像在類聲明後用花括號包含起來的代碼塊被稱爲類代碼塊,方法聲明後包含的代碼塊被稱爲方法代碼塊,嵌套在方法內的代碼塊被稱爲局部代碼塊等等一樣。
  • 嵌套在更內部層次的代碼塊可以使用嵌套外部的代碼塊中的內容,但位於嵌套更外部層次的代碼塊不能使用更內部層次的代碼塊中的內容。所以在上面的例子中我們看到,方法代碼塊中可以使用類代碼塊中聲明的變量;局部代碼塊中,在類代碼塊和方法代碼快中聲明的變量都能夠被訪問;但最後想要在方法代碼塊中訪問局部代碼塊中聲明的變量,程序就編譯失敗了。這一切現象出現的原因,正是因爲:在塊中聲明的變量只在當前塊中有效。
  • 合理的使用代碼塊,可以在一定程度上節約內存開銷。這是因爲之所以說塊中聲明的變量只在當前塊中有效,深入的講,實際就是因爲代碼塊限定了其生命週期,也就是說當虛擬機執行到該代碼塊,當中聲明的變量纔會被加載到內存之中,而隨着該代碼塊的代碼都執行完畢,當中的變量就會在內存中被釋放,所以自然在塊以外就無法再訪問到了。

接着,我們來看第二個注意點:


注意以上代碼截圖中,用紅色方框標記的兩行代碼。

我們寫這段代碼想要驗證的是代碼塊的特性之一:不要在嵌套的兩個代碼塊中聲明相同命名的變量。

那麼,第二個紅框標註的代碼恰恰印證了這一點,在方法代碼塊中聲明瞭名爲“method_block_var”的變量之後,如果再在其嵌套的局部代碼塊中聲明,就會導致編譯出錯。


但讓人在意的是,我們在類代碼塊中聲明瞭一個“class_block_var”的變量,爲何之後我們在其嵌套的方法代碼塊中,仍然可以聲明相同命名的變量呢?

這實際上涉及到Java的內存機制,首先我們需要知道的就是:Java中聲明在類代碼塊中的變量被稱爲該類的成員變量,而聲明在方法或局部代碼塊中的變量被稱爲局部變量。

之所以造成這樣的現象,究其根本是因爲虛擬機內部的內存結構對於成員變量和局部變量的存儲位置是不同的:

類的成員變量會隨着類的對象一起,被存儲在內存當中的堆內存當中;而局部變量則會隨着方法的加載,而被存儲到棧內存當中(方法的壓棧)。


到了這裏就不難理解了:

1.不同的兩個班級:一班(堆內存)和二班(棧內存)中,都有一個名爲“ 小明”的同學(變量)。這樣的情況是沒有任何問題的,因爲你在調用時,可以通過“一班的小明”和“二班的小明”來正確的調用到目標學生。Java中也是這樣的,在對成員變量進行調用時,實際上是隱式的調用了當前類對象關鍵字this。也就是說對成員變量的調用實際上是以:this.var的形式進行調用的,這就很好的與局部變量調用區分開了。

2.但同一個班級中(都位於棧內存)有兩個相同名字的學生 ,那麼再想要正確的調用目標學生就很難了,這會產生“調用的不確定性”。所以自然的,Java作爲一門嚴謹的具有高度健壯性的語言,自然不會允許這樣的“危險因素”存在。

發佈了33 篇原創文章 · 獲贊 13 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章