這篇文章的內(nèi)容主要圍繞java 變量該如何理解進(jìn)行講述,文章內(nèi)容清晰易懂,條理清晰,非常適合新手學(xué)習(xí),值得大家去閱讀。感興趣的朋友可以跟隨小編一起閱讀吧。希望大家通過這篇文章有所收獲!
變量是Java 程序的一個(gè)基本存儲單元。變量由一個(gè)標(biāo)識符,類型及一個(gè)可選初始值的組合定義。此外,所有的變量都有一個(gè)作用域,定義變量的可見性,生存期。接下來討論變量的這些元素。
1 聲明一個(gè)變量
在Java 中,所有的變量必須先聲明再使用。基本的變量聲明方法如下:type identifier [ = value][,identifier [= value] ...] ;
type 是Java 的基本類型之一,或類及接口類型的名字(類和接口類型在本書第1部分的后部討論)。標(biāo)識符(identifier )是變量的名字,指定一個(gè)等號和一個(gè)值來初始化變量。請記住初始化表達(dá)式必須產(chǎn)生與指定的變量類型一樣(或兼容)的變量。聲明指定類型的多個(gè)變量時(shí),使用逗號將各變量分開。
以下是幾個(gè)各種變量聲明的例子。注意有一些包括了初始化。
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)識符為實(shí)型。Java 允許任何合法的標(biāo)識符具有任何它們聲明的類型。
2 動態(tài)初始化
盡管前面的例子僅將字面量作為其初始值,Java 也允許在變量聲明時(shí)使用任何有效的表達(dá)式來動態(tài)地初始化變量。
例如,下面的短程序在給定直角三角形兩個(gè)直角邊長度的情況下,求其斜邊長度。
// 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個(gè)局部變量a,b,c。前兩個(gè)變量a和b初始化為常量。然而直角三角形的斜邊c被動態(tài)地初始化(使用勾股定理)。該程序用了Java 另外一個(gè)內(nèi)置的方法sqrt(),它是Math類的一個(gè)成員,計(jì)算它的參數(shù)的平方根。這里關(guān)鍵的一點(diǎn)是初始化表達(dá)式可以使用任何有效的元素,包括方法調(diào)用、其他變量或字面量。
3 變量的作用域和生存期
到目前為止,我們使用的所有變量都是在方法main() 的后面被聲明。然而,Java 允許變量在任何程序塊內(nèi)被聲明。在第2章中已解釋過了,程序塊被包括在一對大括號中。一個(gè)程序塊定義了一個(gè)作用域(scope )。這樣,你每次開始一個(gè)新塊,你就創(chuàng)建了一個(gè)新的作用域。你可能從先前的編程經(jīng)驗(yàn)知道,一個(gè)作用域決定了哪些對象對程序的其他部分是可見的,它也決定了這些對象的生存期。
大多數(shù)其他計(jì)算機(jī)語言定義了兩大類作用域:全局和局部。然而,這些傳統(tǒng)型的作用域不適合Java 的嚴(yán)格的面向?qū)ο蟮哪P汀.?dāng)然將一個(gè)變量定義為全局變量是可行的,但這是例外而不是規(guī)則。在Java 中2個(gè)主要的作用域是通過類和方法定義的。盡管類的作用域和方法的作用域的區(qū)別有點(diǎn)人為劃定。因?yàn)轭惖淖饔糜蛴腥舾瑟?dú)特的特點(diǎn)和屬性,而且這些特點(diǎn)和屬性不能應(yīng)用到方法定義的作用域,這些差別還是很有意義的。因?yàn)橛胁顒e,類(以及在其內(nèi)定義的變量)的作用域?qū)⒈煌七t到第6章當(dāng)討論類時(shí)再來討論。到現(xiàn)在為止,我們將僅僅考慮由方法或在一個(gè)方法內(nèi)定義的作用域。
方法定義的作用域以它的左大括號開始。但是,如果該方法有參數(shù),那么它們也被包括在該方法的作用域中。本書在第5章將進(jìn)一步討論參數(shù),因此,現(xiàn)在可認(rèn)為它們與方法中其他變量的作用域一樣。
作為一個(gè)通用規(guī)則,在一個(gè)作用域中定義的變量對于該作用域外的程序是不可見(即訪問)的。因此,當(dāng)你在一個(gè)作用域中定義一個(gè)變量時(shí),你就將該變量局部化并且保護(hù)它不被非授權(quán)訪問和/或修改。實(shí)際上,作用域規(guī)則為封裝提供了基礎(chǔ)。
作用域可以進(jìn)行嵌套。例如每次當(dāng)你創(chuàng)建一個(gè)程序塊,你就創(chuàng)建了一個(gè)新的嵌套的作用域。這樣,外面的作用域包含內(nèi)部的作用域。這意味著外部作用域定義的對象對于內(nèi)部作用域中的程序是可見的。但是,反過來就是錯(cuò)誤的。內(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)橐粋€(gè)塊定義一個(gè)作用域,y 僅僅對在它的塊以內(nèi)的其他代碼可見。這就是在它的塊之外的程序行y=100; 被注釋掉的原因。如果你將該行前面的注釋符號去掉,編譯程序時(shí)就會出現(xiàn)錯(cuò)誤,因?yàn)樽兞縴在它的程序塊之外是不可見的。在if程序塊中可以使用變量x,因?yàn)閴K(即一個(gè)嵌套作用域)中的程序可以訪問被其包圍作用域中定義的變量。
變量可以在程序塊內(nèi)的任何地方被聲明,但是只有在他們被聲明以后才是合法有效的。因此,如果你在一個(gè)方法的開始定義了一個(gè)變量,那么它對于在該方法以內(nèi)的所有程序都是可用的。反之,如果你在一個(gè)程序塊的末尾聲明了一個(gè)變量,它就沒有任何用處,因?yàn)闆]有程序會訪問它。例如,下面這個(gè)程序段就是無效的,因?yàn)樽兞縞ount 在它被定義以前是不能被使用的。
// This fragment is wrong!
count = 100; // oops! cannot use count before it is declared!
int count;
另一個(gè)需要記住的重要之處是:變量在其作用域內(nèi)被創(chuàng)建,離開其作用域時(shí)被撤消。
這意味著一個(gè)變量一旦離開它的作用域,將不再保存它的值了。因此,在一個(gè)方法內(nèi)定義的變量在幾次調(diào)用該方法之間將不再保存它們的值。同樣,在塊內(nèi)定義的變量在離開該塊時(shí)也將丟棄它的值。因此,一個(gè)變量的生存期就被限定在它的作用域中。
如果一個(gè)聲明定義包括一個(gè)初始化,那么每次進(jìn)入聲明它的程序塊時(shí),該變量都要被重新初始化。例如,考慮這個(gè)程序:
// 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ùn)行的輸出如下:
y is: -1
y is now: 100
y is: -1
y is now: 100
y is: -1
y is now: 100
可以看到,每次進(jìn)入內(nèi)部的for循環(huán),y都要被重新初始化為-1。即使它隨后被賦值為100,該值還是被丟棄了。
最后一點(diǎn):盡管程序塊能被嵌套,你不能將內(nèi)部作用域聲明的變量與其外部作用域聲明的變量重名。在這一點(diǎn)上,Java 不同于C和C++。下面的例子企圖為兩個(gè)獨(dú)立的變量起同樣的名字。在Java 中,這是不合法的。但在C/C++ 中,它將是合法的,而且2個(gè)變量bar將是獨(dú)立的。
// 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 變量該如何理解”這一問題有一定的了解,快去動手實(shí)踐吧,如果想了解更多相關(guān)知識點(diǎn),可以關(guān)注創(chuàng)新互聯(lián)-成都網(wǎng)站建設(shè)公司網(wǎng)站!小編會繼續(xù)為大家?guī)砀玫奈恼拢?/p>
網(wǎng)站標(biāo)題:java變量該如何理解-創(chuàng)新互聯(lián)
文章URL:http://www.chinadenli.net/article10/gsigo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站制作、企業(yè)建站、響應(yīng)式網(wǎng)站、建站公司、網(wǎng)站維護(hù)、品牌網(wǎng)站設(shè)計(jì)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容