Java中的static關(guān)鍵字修飾屬性和方法(推薦)
static關(guān)鍵字
static關(guān)鍵詞與對(duì)象無關(guān)。
static關(guān)鍵字主要修飾四個(gè)部分的內(nèi)容
這里我們主要介紹static修飾屬性和修飾方法。
1.static修飾屬性(靜態(tài)屬性)
1.1.哪些成員屬性可以被static修飾。
我們把static修飾的屬性稱為靜態(tài)屬性,又叫類屬性。一個(gè)類里面的所有實(shí)例的這個(gè)屬性值都相同,我們就可以把這個(gè)屬性用static修飾,所有實(shí)例共享這個(gè)屬性值。靜態(tài)屬性在程序運(yùn)行中是保存在方法區(qū)中的,而非靜態(tài)成員屬性在創(chuàng)建一個(gè)個(gè)實(shí)例對(duì)象時(shí),和這個(gè)對(duì)象一樣存儲(chǔ)在堆區(qū)。
1.1.1.所有實(shí)例的某個(gè)屬性的值是一樣的,就可以使用static關(guān)鍵字修飾
例如:生活在同一個(gè)城市的所有人的所在地區(qū)屬性值是一樣的。
那么在定義這個(gè)屬性時(shí)就可以使用static關(guān)鍵字修飾。
public class Person { String name; int age; String sex; //所在地區(qū) static String country; }
1.1.2.類中的final常量
使用final修飾的常量的值是不能夠被改變的,那么就意味著這個(gè)類中,所有實(shí)例的這個(gè)屬性的值是一樣的。非靜態(tài)成員屬性每次在創(chuàng)建實(shí)例時(shí)都會(huì)開辟內(nèi)存,如果將final修飾的常量定義成靜態(tài)屬性,就可以節(jié)省每次創(chuàng)建實(shí)例后的一點(diǎn)內(nèi)存。
注意:定義final成員屬性時(shí)一定要賦初值。
public class Person { String name; String sex; //所在地區(qū) static String country; static final int age=18;
1.2.靜態(tài)屬性的訪問。
1.靜態(tài)屬性又稱為類屬性,對(duì)靜態(tài)屬性的訪問不需要?jiǎng)?chuàng)建對(duì)象,可以直接使用類名稱去訪問。
public class Person { String name; int age; String sex; //所在地區(qū) static String country; public static void main(String[] args) { System.out.println(Person.country); } }
2.如果這個(gè)類里面已經(jīng)創(chuàng)建了實(shí)例對(duì)象,也可以通過實(shí)例對(duì)象訪問靜態(tài)屬性。(不推薦)
public class Person { String name; int age; String sex; //所在地區(qū) static String country; public static void main(String[] args) { Person per1=new Person(); System.out.println(per1.country); } }
我們就以前面這段代碼解釋一下代碼運(yùn)行過程中內(nèi)存中的變化。
思考題:
1.我們可以在方法中定義靜態(tài)變量嗎?
答:不可以。方法中的變量是方法在被調(diào)用之后在棧區(qū)中存儲(chǔ)的,而靜態(tài)變量存在方法區(qū)的,不可能存在一個(gè)變量既存儲(chǔ)在方法區(qū)又存儲(chǔ)在棧區(qū)。
2.
public class Person { String name; String sex; //所在地區(qū) static String country; static final int age=18; public static void main(String[] args) { Person per1=new Person(); per1=null; System.out.println(per1.name); } }
上面這串代碼在運(yùn)行時(shí)會(huì)出現(xiàn)
即:空指針異常,這段代碼中,per1引用指向的地址為空。
那么
public class Person { String name; String sex; //所在地區(qū) static String country; static final int age=18; public static void main(String[] args) { Person per1=new Person(); per1=null; System.out.println(per1.country); } }
這段代碼可以運(yùn)行嗎?
答:可以的。因?yàn)閏onutry屬性是靜態(tài)屬性。運(yùn)行這段代碼的時(shí)候系統(tǒng)會(huì)識(shí)別到是Person類中的,per1.country
就相當(dāng)于Person.country
。所以不會(huì)出現(xiàn)空指針異常。
2.static關(guān)鍵字修飾方法
static關(guān)鍵字修飾的方法又叫類方法,工具方法,靜態(tài)方法。同樣的,他也是可以直接使用類名稱.方法名稱調(diào)用。沒有對(duì)象就可以訪問。
1.那些方法可以使用static修飾
1.工具類的方法設(shè)置為static方法
例如:
Arrays.sort(int [ ]):傳入一個(gè)int[ ]就可以使用,不需要?jiǎng)?chuàng)建對(duì)象去使用
2.一個(gè)程序的主方法
程序的主方法就是程序的入口,如果設(shè)置成非靜態(tài)方法,那么主方法的使用就需要?jiǎng)?chuàng)建對(duì)象,而程序都沒有入口進(jìn)入,怎么去創(chuàng)建對(duì)象,程序就無法運(yùn)行。因此程序的主方法要設(shè)置成靜態(tài)方法,直接使用,不需要?jiǎng)?chuàng)建對(duì)象。
2.常見的問題
1.靜態(tài)方法能否訪問成員變量和成員方法
答:不能。靜態(tài)方法的訪問是不需要?jiǎng)?chuàng)建對(duì)象的,也就是說靜態(tài)方法使用中是沒有對(duì)象的,而成員方法和成員變量的使用是需要?jiǎng)?chuàng)建對(duì)象的,所以靜態(tài)方法是無法訪問成員變量和成員方法。
2.成員方法能否訪問靜態(tài)屬性和靜態(tài)方法。
答:可以,成員方法的訪問前提是有對(duì)象,靜態(tài)方法和靜態(tài)屬性的訪問是沒有前提條件的。因此成員方法都可以訪問,那么靜態(tài)方法和靜態(tài)屬性是一定可以訪問的
3.普通的類能否使用static修飾(不是內(nèi)部類)。
答:不可以。類定義出來就是產(chǎn)生相應(yīng)實(shí)例對(duì)象的,而用static修飾之后這個(gè)類沒有對(duì)象就可以調(diào)用了,這個(gè)類就沒有存在的意義了。在編譯過程中程序也會(huì)報(bào)錯(cuò)。
到此這篇關(guān)于Java中的static關(guān)鍵字修飾屬性和方法的文章就介紹到這了,更多相關(guān)Java static關(guān)鍵字修飾屬性和方法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
IntelliJ IDEA2020.2.2創(chuàng)建Servlet方法及404問題
這篇文章主要介紹了IntelliJ IDEA2020.2.2創(chuàng)建Servlet方法及404問題,這里小編使用的2020.2.2企業(yè)破解版本,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-09-09解決springboot+shiro 權(quán)限攔截失效的問題
這篇文章主要介紹了解決springboot+shiro 權(quán)限攔截失效的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-09-09IDEA啟動(dòng)報(bào)錯(cuò)Internal?error.?Please?refer?to?https://jb.gg/i
這篇文章主要介紹了IDEA啟動(dòng)報(bào)錯(cuò)Internal?error.?Please?refer?to?https://jb.gg/ide/critical-startup-errors解決辦法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-04-04idea編譯時(shí)不提示任何錯(cuò)誤信息的問題及解決
這篇文章主要介紹了idea編譯時(shí)不提示任何錯(cuò)誤信息的問題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-12-12Java List轉(zhuǎn)換成String數(shù)組幾種實(shí)現(xiàn)方式詳解
這篇文章主要介紹了Java List轉(zhuǎn)換成String數(shù)組幾種實(shí)現(xiàn)方式詳解的相關(guān)資料,需要的朋友可以參考下2016-12-12淺談web項(xiàng)目讀取classpath路徑下面的文件
這篇文章主要介紹了淺談web項(xiàng)目讀取classpath路徑下面的文件,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-01-01java中volatile關(guān)鍵字的作用與實(shí)例代碼
這篇文章主要給大家介紹了關(guān)于java中volatile關(guān)鍵字的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04Java中構(gòu)造方法set/get和toString的使用詳解
這篇文章主要介紹了Java中構(gòu)造方法set/get和toString的使用詳解,構(gòu)造函數(shù)的最大作用就是創(chuàng)建對(duì)象時(shí)完成初始化,當(dāng)我們?cè)趎ew一個(gè)對(duì)象并傳入?yún)?shù)的時(shí)候,會(huì)自動(dòng)調(diào)用構(gòu)造函數(shù)并完成參數(shù)的初始化,需要的朋友可以參考下2019-07-07