SCJP認證 1.5.4 (2) 變量聲明

 

實例變量

實例變量定義在類中但位於任何方法之外,並且只有在實例化類時纔會被初始化。實例變量是屬於每個唯一對象的字段。

例如,下面給的代碼爲employee對象的nametitlemanager定義字段(實例變量)

 

上面的Employee類表示每個employee實例知道其自己的nametitlemanage。換句話說,對於三個字段,每個實例都能夠擁有它自己的唯一值。如果看到術語字段實例變量"屬性"property)或特性attribute),他們實際上是指同樣的內容(這些屬於之間實際上有一些微妙但有時又很重要的區別,但這些不會體現在考試中)。

對於考試,需要了解實例變量的如下要點:

  • 可以使用4個訪問級別中的任何一個(這意味着它們能夠標識爲3個訪問修飾符中的任何一個) 。
  • 可以標識爲final
  • 可以標識爲transient
  • 不能標識爲abstract
  • 不能標識爲synchronized
  • 不能標識爲strictfp
  • 不能標識爲native
  • 不能標識爲static,否則會變成類變量。

前文已經介紹了將訪問控制應用於實例變量的影響(其作用與對成員方法的作用相同) 。

本章稍後部分將介紹個將final transient修飾符應用於變量意味着什麼。首先,我們簡單說明一項實例變量和局部變量之間的區別。下表比較了能夠應用於方法和變量的修飾符。

 

 

 

局部變量

變量(非局部)

方法

final

final

public

protected

private

static

transient

volatile

final

public

protectd

private

static

abstract

synchronized

 

局部(自動/棧/方法) 變量

局部賓亮是在方法內聲明的變量。這意味着變量不僅在方法內初始化,而且也在方法內聲明。就像局部變量的生命週期從方法呢i開始一樣,當方法完成時,局部變量也會被銷燬。局部變量總是位於棧上,而不是位於堆上(第三章將更多地討論棧和堆) 。儘管變量的值可能傳遞進另一個方法,該方法隋虎將值存儲到實例變量中,但是,變量本省的生命週期只存在於該方法的範圍內。

一定不要忘記,雖然局部變量位於棧上,但如果變量是對象引用,則該兌現本身仍然可以在堆上創建。不存在棧對象,只有棧變量。

局部變量聲明不能使用可以應用於實例變量的多數修飾符,如public(或其他訪問修飾符) 、transient、volatile、abstract或static。但是,如前所述,可將局部變量標識爲final。第三章將會講到(這裏只是一個預覽), 在使用局部變量之前必須用初始化它。例如:

通常在變量聲明語句的同一行上初始化局部變量,儘管 在方法內可能還需要重新初始化它。關鍵是要記住,在試圖使用局部變量之前,必須初始化它。編譯器會拒絕試圖使用未賦值的局部變量的任何代碼,因爲與實例變量不同,局部變量沒有默認值。

不能在聲明ubuntu變量的方法之外的任何代碼中引用該局部變量。在上面個的代碼示例中,在logIn()方法範圍之外的任何地方引用變量count 都是不可能的。重申一遍,這並不是說count的值不能傳遞到該方法之外一獲得新生。而是,只要方法完成就不能像下面的非法代碼所演示的那樣訪問保存該值的變量count:

聲明與實例變量同名的局部變量是可能的。這稱作隱藏(shadowing) ,下面的代碼演示了這一點:

 

 上面的代碼將輸出:

local varable count is 10

instance variable count is 9

究竟威懾呢麼要這樣做呢?通常不會這樣做。但是,比較常見的理由之一是:用與參數將要賦予的實例變量相同的名稱命名該參數。

如下(錯誤的) 代碼嘗試用一個參數設置實例變量的值:

出於總體可讀性考慮,因而決定將參數的名稱命名爲與被賦值的實例變量的名稱相同,但是,怎樣解決這種命名衝突?使用this關鍵字。this關鍵字永遠、永遠、永遠會引用當前運行的對象。下面給的代碼展示了這一點:

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章