Java的變量類型

在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)修飾符修飾
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末征绎,一起剝皮案震驚了整個(gè)濱河市蹲姐,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖淤堵,帶你破解...
    沈念sama閱讀 221,695評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件寝衫,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡拐邪,警方通過(guò)查閱死者的電腦和手機(jī)慰毅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)扎阶,“玉大人汹胃,你說(shuō)我怎么就攤上這事《危” “怎么了着饥?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,130評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)惰赋。 經(jīng)常有香客問(wèn)我宰掉,道長(zhǎng),這世上最難降的妖魔是什么赁濒? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,648評(píng)論 1 297
  • 正文 為了忘掉前任轨奄,我火速辦了婚禮,結(jié)果婚禮上拒炎,老公的妹妹穿的比我還像新娘挪拟。我一直安慰自己,他們只是感情好击你,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,655評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布玉组。 她就那樣靜靜地躺著,像睡著了一般丁侄。 火紅的嫁衣襯著肌膚如雪惯雳。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,268評(píng)論 1 309
  • 那天鸿摇,我揣著相機(jī)與錄音石景,去河邊找鬼。 笑死户辱,一個(gè)胖子當(dāng)著我的面吹牛鸵钝,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播庐镐,決...
    沈念sama閱讀 40,835評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼恩商,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了必逆?” 一聲冷哼從身側(cè)響起怠堪,我...
    開(kāi)封第一講書(shū)人閱讀 39,740評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤揽乱,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后粟矿,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體凰棉,經(jīng)...
    沈念sama閱讀 46,286評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,375評(píng)論 3 340
  • 正文 我和宋清朗相戀三年陌粹,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了撒犀。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,505評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡掏秩,死狀恐怖或舞,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情蒙幻,我是刑警寧澤映凳,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站邮破,受9級(jí)特大地震影響诈豌,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜抒和,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,873評(píng)論 3 333
  • 文/蒙蒙 一矫渔、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧构诚,春花似錦蚌斩、人聲如沸铆惑。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,357評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)员魏。三九已至丑蛤,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間撕阎,已是汗流浹背受裹。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,466評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留虏束,地道東北人棉饶。 一個(gè)月前我還...
    沈念sama閱讀 48,921評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像镇匀,于是被迫代替她去往敵國(guó)和親照藻。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,515評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • Java中有三種變量類型:類變量汗侵、成員變量幸缕、局部變量 變量的格式:type 變量名 = 值以及值之后的冒號(hào) 1.類...
    分布式與微服務(wù)閱讀 95評(píng)論 0 1
  • Java語(yǔ)言支持的變量類型有: 局部變量 成員變量 類變量 Java局部變量 局部變量聲明在方法群发、構(gòu)造方法或者語(yǔ)句...
    夢(mèng)之志閱讀 254評(píng)論 0 1
  • 局部變量:在方法(包括構(gòu)造方法)和語(yǔ)句塊里面定義的變量,局部變量的聲明和初始化都在方法中发乔,方法結(jié)束后熟妓,變量自動(dòng)銷毀...
    平凡的魚(yú)仔閱讀 128評(píng)論 0 0
  • 在Java語(yǔ)言中,所有的變量在使用前必須聲明栏尚。聲明變量的基本格式如下: type identifier [ = v...
    代碼人生sl閱讀 311評(píng)論 0 0
  • java 變量類型 在Java語(yǔ)言中起愈,所有的變量在使用前必須聲明。聲明變量的基本格式如下: 格式說(shuō)明:type為J...
    JANA_0304閱讀 232評(píng)論 0 0