例項變數
例項變數定義在類中但位於任何方法之外,並且只有在例項化類時才會被初始化。例項變數是屬於每個唯一物件的字段。
例如,下面給的**為employee物件的name、title和manager定義字段(例項變數)。
上面的employee類表示每個employee例項知道其自己的name、title和manage。換句話說,對於三個字段,每個例項都能夠擁有它自己的唯一值。如果看到術語「字段」 、「例項變數」、"屬性"(property)或」特性「(attribute),他們實際上是指同樣的內容(這些屬於之間實際上有一些微妙但有時又很重要的區別,但這些不會體現在考試中)。
對於考試,需要了解例項變數的如下要點:
前文已經介紹了將訪問控制應用於例項變數的影響(其作用與對成員方法的作用相同) 。
本章稍後部分將介紹個將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關鍵字永遠、永遠、永遠會引用當前執行的物件。下面給的**展示了這一點:
SCJP認證 1 7小結(宣告訪問控制)
識別符號 考試目標1.3 宣告規則 考試目標1.1 類訪問修飾符 考試目標1.2 類修飾符 非訪問 考試目標1.2 介面實現 考試目標1.2 實現介面的類本身可以是抽象的。抽象實現類不必實現介面方法 但是第乙個具體子類必須實現 類只能擴充套件乙個類 沒有多重基礎那個 但它能夠實現多個介面。介面可以擴...
SCJP認證 1 5 2 1 非訪問修飾符
修飾符 1 final,abstract 2 transient synchronized native strictfp 3 static 首先我們介紹用於方法的修飾符,接著介紹應用於示例變數的修飾符,最後介紹static應用於變數和方法時怎樣工作。final方法 final關鍵字能防止方法在子類...
宣告變數 如果同時宣告多個變數
如果同時宣告多個變數,可以用以下語句 也可以按如下宣告 dim a as integer,b as integer,c as integer但是不可以按如下宣告 dim a,b,c as integer 如果這樣操作,僅有c宣告正確。如何檢查是否宣告成功呢?可以使用typename函式來判斷。msg...