在Java語(yǔ)言中,所有的變量在使用前必須聲明昼激。聲明變量的基本格式如下:
// 中括號(hào)中的內(nèi)容可以有也可以沒(méi)有
// 格式說(shuō)明:
// type -- 數(shù)據(jù)類型魄咕。
// identifier -- 是變量名,可以使用逗號(hào) , 隔開(kāi)來(lái)聲明多個(gè)同類型變量凹耙。
type identifier [ = value][, identifier [= value] ...] ;
一些變量的聲明實(shí)例(注意有些包含了初始化過(guò)程):
int a, b, c; // 聲明三個(gè)int型整數(shù):a稀轨、 b扼脐、c
int d = 3, e = 4, f = 5; // 聲明三個(gè)整數(shù)并賦予初值
byte z = 22; // 聲明并初始化 z
String s = "runoob"; // 聲明并初始化字符串 s
double pi = 3.14159; // 聲明了雙精度浮點(diǎn)型變量 pi
char x = 'x'; // 聲明變量 x 的值是字符 'x'。
Java 語(yǔ)言支持的變量類型:
- 局部變量(Local Variables):定義在方法靶端、構(gòu)造方法或語(yǔ)句塊中的變量谎势,作用域只限于當(dāng)前方法、構(gòu)造方法或語(yǔ)句塊中杨名。局部變量必須在使用前聲明脏榆,并且不能被訪問(wèn)修飾符修飾。
- 成員變量(Instance Variables):定義在類中台谍、方法之外的變量须喂,作用域?yàn)檎麄€(gè)類,可以被類中的任何方法趁蕊、構(gòu)造方法和語(yǔ)句塊訪問(wèn)坞生。成員變量可以被訪問(wèn)修飾符修飾。
- 靜態(tài)變量(Class Variables):定義在類中掷伙、方法之外的變量是己,并且使用 static 關(guān)鍵字修飾,作用域?yàn)檎麄€(gè)類任柜,可以被類中的任何方法卒废、構(gòu)造方法和語(yǔ)句塊訪問(wèn),靜態(tài)變量的值在程序運(yùn)行期間只有一個(gè)副本宙地。靜態(tài)變量可以被訪問(wèn)修飾符修飾摔认。
- 參數(shù)變量(Parameters):方法定義時(shí)聲明的變量,作為調(diào)用該方法時(shí)傳遞給方法的值宅粥。參數(shù)變量的作用域只限于方法內(nèi)部参袱。
變量定義實(shí)例:實(shí)例中定義了一個(gè) RunoobTest 類,其中包含了一個(gè)成員變量 instanceVar 和一個(gè)靜態(tài)變量 staticVar秽梅。method() 方法中定義了一個(gè)參數(shù)變量 paramVar 和一個(gè)局部變量 localVar抹蚀。在方法內(nèi)部,我們將局部變量的值賦給成員變量企垦,將參數(shù)變量的值賦給靜態(tài)變量况鸣,然后打印出這些變量的值:
public class RunoobTest {
// 成員變量
private int instanceVar;
// 靜態(tài)變量
private static int staticVar;
public void method(int paramVar) {
// 局部變量
int localVar = 10;
// 使用變量
instanceVar = localVar;
staticVar = paramVar;
System.out.println("成員變量: " + instanceVar);
System.out.println("靜態(tài)變量: " + staticVar);
System.out.println("參數(shù)變量: " + paramVar);
System.out.println("局部變量: " + localVar);
}
public static void main(String[] args) {
Variables v = new Variables();
v.method(20);
}
}
// 運(yùn)行以上代碼,輸出如下:
// 成員變量: 10
// 靜態(tài)變量: 20
// 參數(shù)變量: 20
// 局部變量: 10
Java 參數(shù)變量
Java 中的參數(shù)變量是指在方法或構(gòu)造函數(shù)中聲明的變量竹观,用于接收傳遞給方法或構(gòu)造函數(shù)的值镐捧。參數(shù)變量與局部變量類似,但它們只在方法或構(gòu)造函數(shù)被調(diào)用時(shí)存在臭增,并且只能在方法或構(gòu)造函數(shù)內(nèi)部使用懂酱。Java 方法的聲明語(yǔ)法如下:
accessModifier returnType methodName(parameterType parameterName1, parameterType parameterName2, ...) {
// 方法體
}
// parameterType -- 表示參數(shù)變量的類型。
// parameterName -- 表示參數(shù)變量的名稱誊抛。
在調(diào)用方法時(shí)列牺,我們必須為參數(shù)變量傳遞值,這些值可以是常量拗窃、變量或表達(dá)式瞎领。方法參數(shù)變量的值傳遞方式有兩種:值傳遞和引用傳遞泌辫。
- 值傳遞:在方法調(diào)用時(shí),傳遞的是實(shí)際參數(shù)的值的副本九默。當(dāng)參數(shù)變量被賦予新的值時(shí)震放,只會(huì)修改副本的值,不會(huì)影響原始值驼修。Java 中的基本數(shù)據(jù)類型都采用值傳遞方式傳遞參數(shù)變量的值殿遂。
- 引用傳遞:在方法調(diào)用時(shí),傳遞的是實(shí)際參數(shù)的引用(即內(nèi)存地址)乙各。當(dāng)參數(shù)變量被賦予新的值時(shí)墨礁,會(huì)修改原始值的內(nèi)容。Java 中的對(duì)象類型采用引用傳遞方式傳遞參數(shù)變量的值耳峦。
Java 局部變量
- 局部變量聲明在方法恩静、構(gòu)造方法或者語(yǔ)句塊中。
- 局部變量在方法蹲坷、構(gòu)造方法蜕企、或者語(yǔ)句塊被執(zhí)行的時(shí)候創(chuàng)建,當(dāng)它們執(zhí)行完成后冠句,變量將會(huì)被銷毀轻掩。
- 局部變量必須在使用前聲明,并且不能被訪問(wèn)修飾符修飾懦底。
- 局部變量只在聲明它的方法唇牧、構(gòu)造方法或者語(yǔ)句塊中可見(jiàn)。
- 局部變量是在棧上分配的聚唐。
- 局部變量沒(méi)有默認(rèn)值丐重,所以局部變量被聲明后,必須經(jīng)過(guò)初始化才可以使用杆查。
局部變量的聲明格式為:
type variableName;
// type -- 表示變量的類型扮惦。
// variableName -- 表示變量的名稱。
局部變量必須在方法亲桦、構(gòu)造方法或語(yǔ)句塊的開(kāi)始處聲明崖蜜,可以初始化或不初始化。如果未初始化客峭,使用該變量時(shí)編譯器會(huì)提示Variable '變量名' might not have been initialized錯(cuò)誤豫领。
局部變量只在聲明它的方法、構(gòu)造方法或語(yǔ)句塊內(nèi)可見(jiàn)舔琅,其他方法等恐、構(gòu)造方法或語(yǔ)句塊不能訪問(wèn)該局部變量。當(dāng)方法、構(gòu)造方法或語(yǔ)句塊執(zhí)行完畢后课蔬,局部變量將被銷毀囱稽,其占用的內(nèi)存也會(huì)被釋放。
成員變量(實(shí)例變量)
- 成員變量聲明在一個(gè)類中二跋,但在方法战惊、構(gòu)造方法和語(yǔ)句塊之外。
- 當(dāng)一個(gè)對(duì)象被實(shí)例化之后同欠,每個(gè)成員變量的值就跟著確定。
- 成員變量在對(duì)象創(chuàng)建的時(shí)候創(chuàng)建横缔,在對(duì)象被銷毀的時(shí)候銷毀铺遂。
- 成員變量的值應(yīng)該至少被一個(gè)方法、構(gòu)造方法或者語(yǔ)句塊引用茎刚,使得外部能夠通過(guò)這些方式獲取實(shí)例變量信息襟锐。
- 成員變量可以聲明在使用前或者使用后。
- 訪問(wèn)修飾符可以修飾成員變量膛锭。
- 成員變量對(duì)于類中的方法粮坞、構(gòu)造方法或者語(yǔ)句塊是可見(jiàn)的。一般情況下應(yīng)該把成員變量設(shè)為私有初狰。通過(guò)使用訪問(wèn)修飾符可以使成員變量對(duì)子類可見(jiàn)莫杈。
- 成員變量具有默認(rèn)值。數(shù)值型變量的默認(rèn)值是0奢入,布爾型變量的默認(rèn)值是 false筝闹,引用類型變量的默認(rèn)值是 null。變量的值可以在聲明時(shí)指定腥光,也可以在構(gòu)造方法中指定关顷;
- 成員變量可以直接通過(guò)變量名訪問(wèn)。但在靜態(tài)方法以及其他類中武福,就應(yīng)該使用完全限定名:ObjectReference.VariableName议双。
與局部變量不同,成員變量的值在創(chuàng)建對(duì)象時(shí)被分配捉片,即使未對(duì)其初始化平痰,它們也會(huì)被賦予默認(rèn)值,例如 int 類型的變量默認(rèn)值為 0伍纫,boolean 類型的變量默認(rèn)值為 false觉增。
成員變量可以通過(guò)對(duì)象訪問(wèn),也可以通過(guò)類名訪問(wèn)(如果它們是靜態(tài)成員變量)翻斟。如果沒(méi)有顯式初始化成員變量逾礁,則它們將被賦予默認(rèn)值。可以在構(gòu)造函數(shù)或其他方法中初始化成員變量嘹履,或者通過(guò)對(duì)象或類名訪問(wèn)它們并設(shè)置它們的值腻扇。
成員變量的聲明格式為:
accessModifier type variableName;
// accessModifier --表示訪問(wèn)修飾符,可以是 public砾嫉、protected幼苛、private 或默認(rèn)訪問(wèn)級(jí)別(即沒(méi)有顯式指定訪問(wèn)修飾符)。
// type -- 表示變量的類型焕刮。
// variableName -- 表示變量的名稱舶沿。
類變量(靜態(tài)變量)
Java 中的靜態(tài)變量是指在類中定義的一個(gè)變量,靜態(tài)變量與類相關(guān)而不是與實(shí)例相關(guān)配并,即無(wú)論創(chuàng)建多少個(gè)類實(shí)例括荡,靜態(tài)變量在內(nèi)存中只有一份拷貝,被所有實(shí)例共享溉旋。靜態(tài)變量在類加載時(shí)被創(chuàng)建畸冲,在整個(gè)程序運(yùn)行期間都存在。
定義方式:靜態(tài)變量的定義方式是在類中使用 static 關(guān)鍵字修飾變量观腊,通常也稱為類變量邑闲。例如定義一個(gè)靜態(tài)變量 count ,其初始值為 0:
public class MyClass {
public static int count = 0;
// 其他成員變量和方法
}
訪問(wèn)方式:由于靜態(tài)變量是與類相關(guān)的梧油,因此可以通過(guò)類名來(lái)訪問(wèn)靜態(tài)變量苫耸,也可以通過(guò)實(shí)例名來(lái)訪問(wèn)靜態(tài)變量。例如訪問(wèn)靜態(tài)變量 count :
MyClass.count = 10; // 通過(guò)類名訪問(wèn)
MyClass obj = new MyClass();
obj.count = 20; // 通過(guò)實(shí)例名訪問(wèn)
靜態(tài)變量的生命周期:靜態(tài)變量的生命周期與程序的生命周期一樣長(zhǎng)儡陨,即它們?cè)陬惣虞d時(shí)被創(chuàng)建鲸阔,在整個(gè)程序運(yùn)行期間都存在,直到程序結(jié)束才會(huì)被銷毀迄委。因此褐筛,靜態(tài)變量可以用來(lái)存儲(chǔ)整個(gè)程序都需要使用的數(shù)據(jù),如配置信息叙身、全局變量等渔扎。
靜態(tài)變量的初始化時(shí)機(jī):靜態(tài)變量在類加載時(shí)被初始化,其初始化順序與定義順序有關(guān)信轿。如果一個(gè)靜態(tài)變量依賴于另一個(gè)靜態(tài)變量晃痴,那么它必須在后面定義,否則編譯時(shí)會(huì)報(bào)錯(cuò)财忽。例如:一個(gè)靜態(tài)變量依賴于另一個(gè)靜態(tài)變量時(shí):
public class MyClass {
public static int count1 = 0;
public static int count2 = count1 + 1;
// 其他成員變量和方法
}
常量和靜態(tài)變量的區(qū)別:常量也是與類相關(guān)的倘核,但它是用 final 關(guān)鍵字修飾的變量,一旦被賦值就不能再修改即彪。與靜態(tài)變量不同的是紧唱,常量在編譯時(shí)就已經(jīng)確定了它的值,而靜態(tài)變量的值可以在運(yùn)行時(shí)改變。另外漏益,常量通常用于存儲(chǔ)一些固定的值蛹锰,如數(shù)學(xué)常數(shù)、配置信息等绰疤,而靜態(tài)變量通常用于存儲(chǔ)可變的數(shù)據(jù)铜犬,如計(jì)數(shù)器、全局狀態(tài)等轻庆⊙⒒總之,靜態(tài)變量是與類相關(guān)的變量余爆,具有唯一性和共享性纷宇,可以用于存儲(chǔ)整個(gè)程序都需要使用的數(shù)據(jù),但需要注意初始化時(shí)機(jī)和與常量的區(qū)別龙屉。
靜態(tài)變量的訪問(wèn)修飾符:靜態(tài)變量的訪問(wèn)修飾符可以是 public呐粘、protected满俗、private 或者默認(rèn)的訪問(wèn)修飾符(即不寫(xiě)訪問(wèn)修飾符)转捕。需要注意的是,靜態(tài)變量的訪問(wèn)權(quán)限與實(shí)例變量不同唆垃,因?yàn)殪o態(tài)變量是與類相關(guān)的五芝,不依賴于任何實(shí)例。
靜態(tài)變量的線程安全性:由于靜態(tài)變量是共享的辕万,所以需要注意其線程安全性枢步。多個(gè)線程同時(shí)對(duì)靜態(tài)變量進(jìn)行讀寫(xiě)操作可能會(huì)導(dǎo)致數(shù)據(jù)不一致或者出現(xiàn)競(jìng)態(tài)條件。因此渐尿,在多線程環(huán)境中使用靜態(tài)變量時(shí)需要進(jìn)行同步操作或者使用線程安全的方式訪問(wèn)醉途。
靜態(tài)變量的命名規(guī)范:靜態(tài)變量的命名規(guī)范與實(shí)例變量相同,一般采用駝峰命名法砖茸,并且要用 static 關(guān)鍵字明確標(biāo)識(shí)隘擎。例如:
public class MyClass {
public static int MAX_COUNT = 100;
// 其他成員變量和方法
}
靜態(tài)變量的使用場(chǎng)景:
- 存儲(chǔ)全局狀態(tài)或配置信息
- 計(jì)數(shù)器或統(tǒng)計(jì)信息
- 緩存數(shù)據(jù)或共享資源
- 工具類的常量或方法
- 單例模式中的實(shí)例變量
成員變量、局部變量凉夯、靜態(tài)變量的區(qū)別
區(qū)分項(xiàng) | 成員變量 | 局部變量 | 靜態(tài)變量 |
---|---|---|---|
定義位置 | 在類中货葬,方法外 | 方法中,或者方法的形式參數(shù) | 在類中,方法外 |
初始化值 | 有默認(rèn)初始化值 | 無(wú)劲够,先定義震桶,賦值后才能使用 | 有默認(rèn)初始化值 |
調(diào)用方式 | 對(duì)象調(diào)用 | --- | 對(duì)象調(diào)用,類名調(diào)用 |
存儲(chǔ)位置 | 堆中 | 棧中 | 方法區(qū) |
生命周期 | 與對(duì)象共存亡 | 與方法共存亡 | 整個(gè)程序運(yùn)行期間都存在 |
別名 | 實(shí)例變量 | --- | 類變量 |
訪問(wèn)修飾符 | 可以被訪問(wèn)修飾符修飾 | 不能被訪問(wèn)修飾符修飾 | 可以被訪問(wèn)修飾符修飾 |