Java中局部變量和成員變量的區(qū)別詳解
一. 關(guān)于變量
在之前的文章中,已經(jīng)給大家詳細(xì)地介紹過(guò)變量相關(guān)的內(nèi)容,比如變量的概念、命名規(guī)范、變量的定義及底層原理等內(nèi)容。但其實(shí)變量還有作用范圍的概念,并且根據(jù)作用范圍的不同,變量還可以分為成員變量、局部變量等內(nèi)容。在我們今天開始學(xué)習(xí)局部變量和成員變量等內(nèi)容之前,先簡(jiǎn)單地帶大家復(fù)習(xí)一下之前的變量?jī)?nèi)容。
1. 概念
我們知道,在Java中,變量是程序里最基本的存儲(chǔ)單元,它由變量名、變量類型、作用域組成。從本質(zhì)上來(lái)說(shuō),變量其實(shí)就是內(nèi)存里的一小塊存儲(chǔ)區(qū)域,該區(qū)域只能存儲(chǔ)聲明變量時(shí)指定類型的數(shù)據(jù)。我們創(chuàng)建使用每個(gè)變量前,必須先聲明,在內(nèi)存中申請(qǐng)空間,然后對(duì)其進(jìn)行初始化賦值,接著就可以通過(guò)變量名來(lái)訪問(wèn)和使用這塊內(nèi)存區(qū)域了。
進(jìn)一步解釋一下,變量其實(shí)就是一個(gè)可以存儲(chǔ)特定類型數(shù)據(jù)的容器。這個(gè)容器在內(nèi)存中有自己的地址,為了方便地找到這個(gè)地址,我們可以給每個(gè)地址起個(gè)”名字“,這就是”變量名“。每個(gè)變量的數(shù)據(jù)類型都是固定不變的,但變量中對(duì)應(yīng)數(shù)據(jù)的具體內(nèi)容,卻是可以改變的,所以”變量“指的就是內(nèi)容可以改變的量。
2. 命名規(guī)范
而且變量的命名需要遵循一定的規(guī)范,基本的規(guī)則和規(guī)范如下:
①. Java標(biāo)識(shí)符由 字母(含英、中、日、俄等)、數(shù)字、下劃線"_" 和 美元符號(hào)$(音: dollar)組成, 如age、G7、_value、$salary;
②. 不能以數(shù)字開頭, 如123abc;
③. 嚴(yán)格區(qū)分大小寫, 如class與Class是不同的;
④. 長(zhǎng)度無(wú)限制(一般不要超過(guò)15個(gè)字符);
⑤. 不能是Java中的保留字和關(guān)鍵字。
Java的變量名也是一種標(biāo)識(shí)符,所以必須遵循以上這些規(guī)則! 另外還有一些命名規(guī)范需要我們盡量遵守,比如:
- 變量名盡量要做到見(jiàn)名知意。在實(shí)際開發(fā)時(shí)盡量不要寫a、b、c這種名稱;
- 變量名的首字母要小寫。如果名稱由多個(gè)單詞組成,第一個(gè)單詞的首字母應(yīng)小寫,剩下的單詞首字母應(yīng)大寫(駝峰式命名法),例如
xxxYyyZzz、numCounter
。
3. 作用范圍
其實(shí),除了以上的這些規(guī)范之外,我們?cè)诙x變量時(shí)還要考慮它的作用范圍,或者說(shuō)是作用域。
變量的作用范圍,或者叫作用域,是指一個(gè)變量的有效范圍。有的變量在整個(gè)類中都是有效的,也有的變量只在方法內(nèi)部有效,超過(guò)這個(gè)范圍就無(wú)效了。 如果我們?cè)诔隽俗饔糜虻牡胤揭眠@些變量,編譯器就會(huì)報(bào)錯(cuò)。這就好比,不同的人有不同的權(quán)力,有的人權(quán)力比較大,可以在全世界發(fā)號(hào)施令;有的人權(quán)力比較小,只能在自己家里發(fā)號(hào)施令,這就是自己的”作用范圍“或者”作用域“。
我們?cè)诙x變量時(shí),要遵循作用域最小化的原則,盡量將變量定義在盡可能小的作用范圍內(nèi),并且不要重復(fù)使用變量名。
4. 變量分類
在Java中,我們可以根據(jù)變量的作用范圍,將Java的變量分為兩大類:
- 局部變量: 局部變量只在定義它的方法或代碼塊內(nèi)部有效,不能在其他的方法或代碼塊中使用。也就是說(shuō),局部變量只在一個(gè)方法或代碼塊的一對(duì){}之間有效。局部變量定義的范圍包括形參、方法內(nèi)部、代碼塊內(nèi)部。
- 成員變量:成員變量在整個(gè)類內(nèi)部都有效,可以在當(dāng)前類的任何方法中使用。根據(jù)是否帶有static關(guān)鍵字,成員變量又分為靜態(tài)變量(類變量)、實(shí)例變量(對(duì)象變量)。
二. 局部變量
1. 概念
在上面的章節(jié)中,其實(shí)已經(jīng)跟大家介紹了局部變量的概念,即:
局部變量是在定義形參、方法或代碼塊內(nèi)部的變量,該變量只在當(dāng)前方法、代碼塊中有效。
2. 特點(diǎn)
局部變量具有如下特點(diǎn):
- 局部變量聲明在方法、構(gòu)造方法或者代碼塊、形參中;
- 局部變量在方法、構(gòu)造方法、或者語(yǔ)句塊被執(zhí)行時(shí)創(chuàng)建,當(dāng)它們執(zhí)行完成后,局部變量就會(huì)被銷毀;
- 訪問(wèn)修飾符不能添加在局部變量上;
- 局部變量只在聲明它的方法、構(gòu)造方法或者代碼塊、形參中可見(jiàn);
- 局部變量是在棧上分配的;
- 局部變量沒(méi)有默認(rèn)值,所以局部變量被聲明后,必須經(jīng)過(guò)初始化,才可以使用。
3. 案例
在下面的案例中,給大家定義了幾個(gè)局部變量供大家參考。
/** * @author */ public class Demo01 { //args也是一種局部變量,在main(){}方法的{}范圍內(nèi)有效 public static void main(String[] args) { //局部變量,在main(){}方法的{}范圍內(nèi)有效 int a = 10; System.out.println("a=" + a); } public void showAge() { //i也是一種局部變量,只在for(){}這對(duì){}范圍內(nèi) for(int i=0;i<100;i++) { System.out.println("age=" + age); } } }
三. 成員變量
1 概念
所謂的成員變量,是指在類中(不是方法或其他代碼塊)直接定義的變量。根據(jù)是否帶有static關(guān)鍵字,成員變量又分為靜態(tài)變量(類變量)、實(shí)例變量(對(duì)象變量) 。成員變量在整個(gè)類的內(nèi)部都有效,可以在當(dāng)前類的任何方法中使用。另外如果成員變量不是被private修飾的,還可以在其他的類中引用。
2. 實(shí)例變量
實(shí)例變量也被成為對(duì)象變量,是指在類中定義的非static變量。實(shí)例變量具有如下特點(diǎn):
- 實(shí)例變量聲明在一個(gè)類中,但在方法、構(gòu)造方法和語(yǔ)句塊的外面;
- 當(dāng)一個(gè)對(duì)象被實(shí)例化之后,每個(gè)實(shí)例變量的值也就跟著確定了;
- 實(shí)例變量在對(duì)象創(chuàng)建時(shí)創(chuàng)建,在對(duì)象被銷毀時(shí)銷毀;
- 實(shí)例變量對(duì)于類中的方法、構(gòu)造方法或者語(yǔ)句塊都是可見(jiàn)的。一般情況下我們應(yīng)該把實(shí)例變量設(shè)為私有,通過(guò)訪問(wèn)修飾符可以使實(shí)例變量對(duì)子類也可見(jiàn);
- 實(shí)例變量具有默認(rèn)值。數(shù)值型變量的默認(rèn)值是0,布爾型變量的默認(rèn)值是false,引用類型變量的默認(rèn)值是null。變量的值可以在聲明時(shí)指定,也可以在構(gòu)造方法中指定;
- 實(shí)例變量可以直接通過(guò)變量名訪問(wèn)。但在靜態(tài)方法以及其他類中,應(yīng)該使用完全限定名:ObjectReference.VariableName。
3. 靜態(tài)變量
靜態(tài)變量又被稱為類變量,是被static修飾的、直接定義在類中(方法之外)的變量,它具有如下特點(diǎn):
- 靜態(tài)變量可以被public、private、final和static修飾;
- 靜態(tài)變量在方法外面定義,但可以在靜態(tài)語(yǔ)句塊中初始化,且初始化后不可被改變;
- 靜態(tài)變量與實(shí)例變量具有相似的可見(jiàn)性。但為了對(duì)類的使用者可見(jiàn),大多數(shù)靜態(tài)變量都聲明為public類型;
- 靜態(tài)變量的默認(rèn)值和實(shí)例變量相似;
- 靜態(tài)變量通過(guò)
ClassName.VariableName
的形式進(jìn)行訪問(wèn);- 靜態(tài)變量存儲(chǔ)在靜態(tài)存儲(chǔ)區(qū);
- 靜態(tài)變量在第一次被訪問(wèn)時(shí)創(chuàng)建,在程序結(jié)束時(shí)銷毀;
- 無(wú)論在一個(gè)類中創(chuàng)建了多少個(gè)對(duì)象,一個(gè)類都只擁有類變量的一份拷貝;
- 靜態(tài)變量被聲明為
public static final
類型時(shí),變量名稱一般建議使用大寫字母。
4. 權(quán)限修飾符
大家要注意,成員變量的作用域,是可以通過(guò)權(quán)限修飾符來(lái)進(jìn)行修改的。也就是說(shuō),我們可以給一個(gè)成員變量不同的修飾符,賦予該變量不同的權(quán)限。比如,我們可以給一個(gè)人身上賦予不同的”角色標(biāo)簽“,就可以改變這個(gè)人的”權(quán)力大小“。在Java中,有如下4種權(quán)限修飾符:
修飾符 | 類內(nèi)部 | 同一個(gè)包 | 不同包的其他子類 | 同一個(gè)工程 |
---|---|---|---|---|
private | 可以(繼承是特例) | |||
默認(rèn) | 可以 | 可以 | ||
protected | 可以 | 可以 | 可以 | |
public | 可以 | 可以 | 可以 | 可以 |
private私有的修飾符:可以修飾成員變量、成員方法、構(gòu)造方法,但不能修飾類(內(nèi)部類除外) 。被private修飾的成員只能在被修飾的本類中訪問(wèn),在其他類中不能調(diào)用。 一般被private修飾的成員變量,是通過(guò)公開的set和get方法向外界提供訪問(wèn)方式。
defalut默認(rèn)的修飾符:不用寫任何關(guān)鍵字,它可以修飾類、成員變量、成員方法、構(gòu)造方法。變量被默認(rèn)權(quán)限修飾后,只能被本類以及同一個(gè)包下的其他類訪問(wèn)。
protected受保護(hù)的修飾符:可以修飾成員變量、成員方法、構(gòu)造方法,但不能修飾類( 內(nèi)部類除外 ) 。成員變量被protected修飾后,可以在同一類內(nèi)部,和同一包中的其他類訪問(wèn)。如果不同包中的類想要訪問(wèn)被protected修飾的成員,這個(gè)類必須是其子類。
public公開的修飾符:是權(quán)限最大的修飾符,可以修飾類、成員變量、成員方法、 構(gòu)造方法。成員變量被public修飾后,可以在任何一個(gè)類中任意使用,不管是否是同一個(gè)包。
5. 案例
在下面的案例中,定義了2個(gè)成員變量供大家參考:
/** * @author */ public class Demo01 { //實(shí)例變量、對(duì)象變量,在當(dāng)前的Demo01類內(nèi)部有效 private int age = 18; //靜態(tài)變量、類變量,因?yàn)槭莗ublic公開的,在當(dāng)前Demo01類內(nèi)部,及其他類中都可以使用 public static String msg = "Hello,一一哥"; public static void main(String[] args) { //注意:在static靜態(tài)方法中不能引用非靜態(tài)變量 //System.out.println("age=" + age); System.out.println("msg=" + msg); } }
四. 結(jié)語(yǔ)
至此,就把局部變量相關(guān)的內(nèi)容給大家介紹完了,現(xiàn)在你知道什么是局部變量及其特點(diǎn)了嗎?另外我們要搞清楚局部變量和成員變量的區(qū)別:
1. 相同點(diǎn):
定義變量的格式相同;
先聲明后使用;
變量都有對(duì)應(yīng)的作用域。
2. 不同點(diǎn):
兩者聲明的位置及作用范圍不同,如下表所示:
成員變量 | 直接定義在類中,根據(jù)修飾符的不同,可以在當(dāng)前類或其他類中有效。 |
---|---|
局部變量 | 定義在方法的形參、方法內(nèi)部、代碼塊內(nèi)部的變量。只在當(dāng)前方法及代碼塊內(nèi)部有效。 |
以上就是Java中局部變量和成員變量的區(qū)別詳解的詳細(xì)內(nèi)容,更多關(guān)于Java局部變量和成員變量的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Mybatis實(shí)現(xiàn)數(shù)據(jù)的增刪改查實(shí)例(CRUD)
本篇文章主要介紹了Mybatis實(shí)現(xiàn)數(shù)據(jù)的增刪改查實(shí)例(CRUD),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-05-05SpringBoot項(xiàng)目使用slf4j的MDC日志打點(diǎn)功能(最新推薦)
這篇文章主要介紹了SpringBoot項(xiàng)目使用slf4j的MDC日志打點(diǎn)功能,本文通過(guò)示例代碼給大家介紹非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-06-06Spring Security中用JWT退出登錄時(shí)遇到的坑
使用了JWT后,每次請(qǐng)求都要攜帶 Bearer Token 并且被專門的過(guò)濾器攔截解析之后才能將用戶認(rèn)證信息保存到 SecurityContext 中去,接下來(lái)通過(guò)本文給大家介紹Spring Security中用JWT退出登錄時(shí)遇到的坑,感興趣的朋友一起看看吧2021-10-10SpringBoot錯(cuò)誤提示400狀態(tài)問(wèn)題
這篇文章主要介紹了SpringBoot錯(cuò)誤提示400狀態(tài)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-08-08詳解Spring Cloud Consul 實(shí)現(xiàn)服務(wù)注冊(cè)和發(fā)現(xiàn)
這篇文章主要介紹了Spring Cloud Consul 實(shí)現(xiàn)服務(wù)注冊(cè)和發(fā)現(xiàn),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-03-03基于SpringCloudGateway實(shí)現(xiàn)微服務(wù)網(wǎng)關(guān)的方式
Spring?Cloud?Gateway是Spring?官方基于Spring?5.0,Spring?Boot?2.0和Project?Reactor?等技術(shù)開發(fā)的網(wǎng)關(guān),旨在為微服務(wù)架構(gòu)提供一種簡(jiǎn)單而有效的統(tǒng)一的API路由管理方式,對(duì)SpringCloudGateway實(shí)現(xiàn)微服務(wù)網(wǎng)關(guān)相關(guān)知識(shí)感興趣的朋友一起看看吧2021-12-12