您好,登錄后才能下訂單哦!
這篇文章的內(nèi)容主要圍繞java 變量該如何理解進行講述,文章內(nèi)容清晰易懂,條理清晰,非常適合新手學(xué)習(xí),值得大家去閱讀。感興趣的朋友可以跟隨小編一起閱讀吧。希望大家通過這篇文章有所收獲!
變量是Java 程序的一個基本存儲單元。變量由一個標(biāo)識符,類型及一個可選初始值的組合定義。此外,所有的變量都有一個作用域,定義變量的可見性,生存期。接下來討論變量的這些元素。
1 聲明一個變量
在Java 中,所有的變量必須先聲明再使用?;镜淖兞柯暶鞣椒ㄈ缦拢簍ype identifier [ = value][,identifier [= value] ...] ;
type 是Java 的基本類型之一,或類及接口類型的名字(類和接口類型在本書第1部分的后部討論)。標(biāo)識符(identifier )是變量的名字,指定一個等號和一個值來初始化變量。請記住初始化表達式必須產(chǎn)生與指定的變量類型一樣(或兼容)的變量。聲明指定類型的多個變量時,使用逗號將各變量分開。
以下是幾個各種變量聲明的例子。注意有一些包括了初始化。
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'.
你選擇的標(biāo)識符名稱沒有任何表明它們類型的東西。許多讀者記得FORTRAN 預(yù)先規(guī)定從I到N的所有標(biāo)識符都為整型,其他的標(biāo)識符為實型。Java 允許任何合法的標(biāo)識符具有任何它們聲明的類型。
2 動態(tài)初始化
盡管前面的例子僅將字面量作為其初始值,Java 也允許在變量聲明時使用任何有效的表達式來動態(tài)地初始化變量。
例如,下面的短程序在給定直角三角形兩個直角邊長度的情況下,求其斜邊長度。
// 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被動態(tài)地初始化(使用勾股定理)。該程序用了Java 另外一個內(nèi)置的方法sqrt(),它是Math類的一個成員,計算它的參數(shù)的平方根。這里關(guān)鍵的一點是初始化表達式可以使用任何有效的元素,包括方法調(diào)用、其他變量或字面量。
3 變量的作用域和生存期
到目前為止,我們使用的所有變量都是在方法main() 的后面被聲明。然而,Java 允許變量在任何程序塊內(nèi)被聲明。在第2章中已解釋過了,程序塊被包括在一對大括號中。一個程序塊定義了一個作用域(scope )。這樣,你每次開始一個新塊,你就創(chuàng)建了一個新的作用域。你可能從先前的編程經(jīng)驗知道,一個作用域決定了哪些對象對程序的其他部分是可見的,它也決定了這些對象的生存期。
大多數(shù)其他計算機語言定義了兩大類作用域:全局和局部。然而,這些傳統(tǒng)型的作用域不適合Java 的嚴格的面向?qū)ο蟮哪P?。?dāng)然將一個變量定義為全局變量是可行的,但這是例外而不是規(guī)則。在Java 中2個主要的作用域是通過類和方法定義的。盡管類的作用域和方法的作用域的區(qū)別有點人為劃定。因為類的作用域有若干獨特的特點和屬性,而且這些特點和屬性不能應(yīng)用到方法定義的作用域,這些差別還是很有意義的。因為有差別,類(以及在其內(nèi)定義的變量)的作用域?qū)⒈煌七t到第6章當(dāng)討論類時再來討論。到現(xiàn)在為止,我們將僅僅考慮由方法或在一個方法內(nèi)定義的作用域。
方法定義的作用域以它的左大括號開始。但是,如果該方法有參數(shù),那么它們也被包括在該方法的作用域中。本書在第5章將進一步討論參數(shù),因此,現(xiàn)在可認為它們與方法中其他變量的作用域一樣。
作為一個通用規(guī)則,在一個作用域中定義的變量對于該作用域外的程序是不可見(即訪問)的。因此,當(dāng)你在一個作用域中定義一個變量時,你就將該變量局部化并且保護它不被非授權(quán)訪問和/或修改。實際上,作用域規(guī)則為封裝提供了基礎(chǔ)。
作用域可以進行嵌套。例如每次當(dāng)你創(chuàng)建一個程序塊,你就創(chuàng)建了一個新的嵌套的作用域。這樣,外面的作用域包含內(nèi)部的作用域。這意味著外部作用域定義的對象對于內(nèi)部作用域中的程序是可見的。但是,反過來就是錯誤的。內(nèi)部作用域定義的對象對于外部是不可見的。
為理解嵌套作用域的效果,考慮下面的程序:
// Demonstrate block scope.
class Scope {
public static void main(String args[]) {
int x; // known to all code within main
x = 10;
if(x == 10) { // start new scope
int y = 20; // known only to this block
// x and y both known here.
System.out.println("x and y: " + x + " " + y);
x = y * 2;
}
// y = 100; // Error! y not known here
// x is still known here.
System.out.println("x is " + x);
}
}
正如注釋中說明的那樣,在方法main() 的開始定義了變量x,因此它對于main() 中的所有的隨后的代碼都是可見的。在if程序塊中定義了變量y。因為一個塊定義一個作用域,y 僅僅對在它的塊以內(nèi)的其他代碼可見。這就是在它的塊之外的程序行y=100; 被注釋掉的原因。如果你將該行前面的注釋符號去掉,編譯程序時就會出現(xiàn)錯誤,因為變量y在它的程序塊之外是不可見的。在if程序塊中可以使用變量x,因為塊(即一個嵌套作用域)中的程序可以訪問被其包圍作用域中定義的變量。
變量可以在程序塊內(nèi)的任何地方被聲明,但是只有在他們被聲明以后才是合法有效的。因此,如果你在一個方法的開始定義了一個變量,那么它對于在該方法以內(nèi)的所有程序都是可用的。反之,如果你在一個程序塊的末尾聲明了一個變量,它就沒有任何用處,因為沒有程序會訪問它。例如,下面這個程序段就是無效的,因為變量count 在它被定義以前是不能被使用的。
// This fragment is wrong!
count = 100; // oops! cannot use count before it is declared!
int count;
另一個需要記住的重要之處是:變量在其作用域內(nèi)被創(chuàng)建,離開其作用域時被撤消。
這意味著一個變量一旦離開它的作用域,將不再保存它的值了。因此,在一個方法內(nèi)定義的變量在幾次調(diào)用該方法之間將不再保存它們的值。同樣,在塊內(nèi)定義的變量在離開該塊時也將丟棄它的值。因此,一個變量的生存期就被限定在它的作用域中。
如果一個聲明定義包括一個初始化,那么每次進入聲明它的程序塊時,該變量都要被重新初始化。例如,考慮這個程序:
// Demonstrate lifetime of a variable.
class LifeTime {
public static void main(String args[]) {
int x;
for(x = 0; x < 3; x++) {
int y = -1; // y is initialized each time block is enteredSystem.out.println("y is: " + y); // this always prints -1y = 100;System.out.println("y is now: " + y);
}
}
}
該程序運行的輸出如下:
y is: -1
y is now: 100
y is: -1
y is now: 100
y is: -1
y is now: 100
可以看到,每次進入內(nèi)部的for循環(huán),y都要被重新初始化為-1。即使它隨后被賦值為100,該值還是被丟棄了。
最后一點:盡管程序塊能被嵌套,你不能將內(nèi)部作用域聲明的變量與其外部作用域聲明的變量重名。在這一點上,Java 不同于C和C++。下面的例子企圖為兩個獨立的變量起同樣的名字。在Java 中,這是不合法的。但在C/C++ 中,它將是合法的,而且2個變量bar將是獨立的。
// This program will not compile
class ScopeErr {
public static void main(String args[]) {
int bar = 1;
{ // creates a new scope
int bar = 2; // Compile-time error – bar already defined!
}
}
}
感謝你的閱讀,相信你對“java 變量該如何理解”這一問題有一定的了解,快去動手實踐吧,如果想了解更多相關(guān)知識點,可以關(guān)注億速云網(wǎng)站!小編會繼續(xù)為大家?guī)砀玫奈恼拢?/p>
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。