變量是java 程序的一個基本存儲單元。變量由一個標識符,類型及一個可選初始值的組合定義。此外,所有的變量都有一個作用域,定義變量的可見性,生存期。接下來討論變量的這些元素。
3.8.1 聲明一個變量
在Java 中,所有的變量必須先聲明再使用。基本的變量聲明方法如下:type identifier [ = value][,identifier [= value] ...] ;
type 是Java 的基本類型之一,或類及接口類型的名字(類和接口類型在本書第1部分的后部討論)。標識符(identifier )是變量的名字,指定一個等號和一個值來初始化變量。請記住初始化表達式必須產生與指定的變量類型一樣(或兼容)的變量。聲明指定類型的多個變量時,使用逗號將各變量分開。
以下是幾個各種變量聲明的例子。注重有一些包括了初始化。
int a, b, c; // declares three ints, a, b, and c.int d = 3, e, f = 5; // declares three more ints, initializing // d and f.byte z = 22; // initializes z.
double pi = 3.14159; // declares an apPRoximation of pi.char x = 'x'; // the variable x has the value 'x'.
你選擇的標識符名稱沒有任何表明它們類型的東西。許多讀者記得FORTRAN 預先規定從I到N的所有標識符都為整型,其他的標識符為實型。Java 答應任何合法的標識符具有任何它們聲明的類型。
3.8.2 動態初始化
盡管前面的例子僅將字面量作為其初始值,Java 也答應在變量聲明時使用任何有效的表達式來動態地初始化變量。
例如,下面的短程序在給定直角三角形兩個直角邊長度的情況下,求其斜邊長度。
// Demonstrate dynamic initialization.
class DynInit {
public static void main(String args[]) {
double a = 3.0, b = 4.0;
// c is dynamically initialized
double c = Math.sqrt(a * a + b * b);
System.out.println("Hypotenuse is " + c);
}
}
這里,定義了3個局部變量a,b,c。前兩個變量a和b初始化為常量。然而直角三角形的斜邊c被動態地初始化(使用勾股定理)。該程序用了Java 另外一個內置的方法sqrt(),它是Math類的一個成員,計算它的參數的平方根。這里要害的一點是初始化表達式可以使用任何有效的元素,包括方法調用、其他變量或字面量。
3.8.3 變量的作用域和生存期
到目前為止,我們使用的所有變量都是在方法main() 的后面被聲明。然而,Java 答應變量在任何程序塊內被聲明。在第2章中已解釋過了,程序塊被包括在一對大括號中。一個程序塊定義了一個作用域(scope )。這樣,你每次開始一個新塊,你就創建了一個新的作用域。你可能從先前的編程經驗知道,一個作用域決定了哪些對象對程序的其他部分是可見的,它也決定了這些對象的生存期。
大多數其他計算機語言定義了兩大類作用域:全局和局部。然而,這些傳統型的作用域不適合Java 的嚴格的面向對象的模型。當然將一個變量定義為全局變量是可行的,但這是例外而不是規則。在Java 中2個主要的作用域是通過類和方法定義的。盡管類的作用域和方法的作用域的區別有點人為劃定。因為類的作用域有若干獨特的特點和屬性,而且這些特點和屬性不能應用到方法定義的作用域,這些差別還是很有意義的。因為有差別,類(以及在其內定義的變量)的作用域將被推遲到第6章當討論類時再來討論。到現在為止,我們將僅僅考慮由方法或在一個方法內定義的作用域。
方法定義的作用域以它的左大括號開始。但是,假如該方法有參數,那么它們也被包括在該方法的作用域中。本書在第5章將進一步討論參數,因此,現在可認為它們與方法中其他變量的作用域一樣。
作為一個通用規則,在一個作用域中定義的變量對于該作用域外的程序是不可見(即訪問)的。因此,當你在一個作用域中定義一個變量時,你就將該變量局部化并且保護它不被非授權訪問和/或修改。實際上,作用域規則為封裝提供了基礎。
作用域可以進行嵌套。例如每次當你創建一個程序塊,你就創建了一個新的嵌套的作用域。這樣,外面的作用域包含內部的作用域。這意味著外部作用域定義的對象對于內部作用域中的程序是可見的。但是,反過來就是錯誤的。內部作用域定義的對象對于外部是不可見的。
新聞熱點
疑難解答