一篇文章帶你入門Java修飾符
定義
Java修飾符:修飾符用來定義類、方法或者變量,通常放在語句的最前端。
分類
主要分為2類:
訪問控制修飾符
非訪問控制修飾符
訪問控制修飾符
可以使用訪問控制符來保護對類、變量、方法和構造方法的訪問。分為以下4中權限:private,default,protected,public。
權限說明:
修飾符 | 當前類 | 同包 | 子類(不同包) | 不同包(其他類) |
---|---|---|---|---|
private | Y | |||
default | Y | Y | ||
protected | Y | Y | Y | |
public | Y | Y | Y | Y |
非訪問控制修飾符
修飾符 | 說明 |
---|---|
static | 用來修飾類方法和類變量。 |
final | 用來修飾類、方法和變量,final 修飾的類不能夠被繼承,修飾的方法不能被繼承類重新定義,修飾的變量為常量,是不可修改的。 |
abstract | 用來創建抽象類和抽象方法。 |
synchronized volatile |
主要用於線程的編程。 |
修飾符的使用說明
修飾類
1.public 將一個類聲明為公共類,他可以被任何對象訪問,一個程序的主類必須是公共類,一個.java文件中隻能有一個public類,而且文件名必須與該類相同。
public class Learn9 { public static void main(String[] args) { } }
假如類名與文件名不一致
如果一個 .java 文件中兩個public類呢?
報錯跟剛才一樣,就是公共類必須獨立占用一個java文件。
1.把下面修飾類的public去掉就可以瞭。
♀ 小AD:明哥,我有個問題?
♂ 明世隱:請放!
♀ 小AD:文明點啊哥,就知道欺負人傢,我就想說這一個類裡面怎麼還可以再放一個類的,也沒看到報錯。
♂ 明世隱:這個是可以的,就比如我可以帶你雙排、三排、5排,甚至可以。。。,但是你必須搞清楚誰是大哥,誰是小老弟。
♀ 小AD:哥我知道,你就是那個大哥,隻有你可以拋頭露面、帶頭沖鋒,用public修飾。
♂ 明世隱:算你識相,不然我單排去瞭。
♀ 小AD:是是是,哥回頭請你吃奶茶!
♂ 明世隱:說謊的人要吞一千根針哦。
♀ 小AD:。。。
♂ 明世隱:一般也不這樣寫,寫成單獨的普通類,這種內部類寫法主要是一個功能模塊的方便或者相關的封裝。
♂ 明世隱:其實他們雖然放在一起,也隻是編譯時概念,編譯完成後也是獨立的class文件。
♀ 小AD:哦
♂ 明世隱:就比如剛才寫的代碼
2.默認的,把一個類聲明為默認的,可以被同一個包中的其他類使用。
3.abstract,將一個類聲明為抽象類,抽象類中可以有抽象方法,也可以沒有。抽象類隻能被繼承不能被實例化。
4.final,將一個類聲明為最終(即非繼承類),表示他不能被其他類繼承。
5.外部類不能使用protected、private、static等修飾符,內部類可以使用。
♀ 小AD:我開始懵逼瞭。
♂ 明世隱:很正常,因為抽象類、最終類的你都沒接觸過,不過不要緊,你現階段隻要有個印象,不需要去記,後面單獨再講這個,你隻需要知道public修飾類就行瞭。
♀ 小AD:好,這樣就比較好弄。
修飾方法
訪問控制修飾符
1.private
在Learn10類中創建私有方法test
private void test() { System.out.println("learn10 test方法被調用"); }
主方法main 調用這個方法
public class Learn10 { public static void main(String[] args) { System.out.println("learn10 main"); new Learn10().test(); } private void test() { System.out.println("learn10 test方法被調用"); } }
運行
在同包下的 Learn9 類看能否調用此方法
同包下的類都不能調用private瞭,更別說其他包瞭。
2.default
把Learn10類中創建方法test改成默認的,也就是把private刪除
public class Learn10 { public static void main(String[] args) { System.out.println("learn10 main"); new Learn10().test(); } void test() { System.out.println("learn10 test方法被調用"); } }
public class Learn9 { public static void main(String[] args) { System.out.println("learn9 main"); new Learn10().test(); } }
可以看到本類和同包下的類可以訪問的,其他包的試一下。
建立包adc,並創建類XiaoLuBan,調用test方法:
3.protected
把Learn10類中創建方法test改成protected的,然後發現跟上面的是一樣的,其他包中也不行,但實際上這個在子類中是可以的,子類的問題下次再研究。
4.public
方法修飾改成public
public class Learn10 { public static void main(String[] args) { System.out.println("learn10 main"); new Learn10().test(); } public void test() { System.out.println("learn10 test方法被調用"); } }
public class Learn9 { public static void main(String[] args) { System.out.println("learn9 main"); new Learn10().test(); } }
import learnJava.Learn10; public class XiaoLuBan { public static void main(String[] args) { new Learn10().test(); } }
發現public是都可以用。
♀ 小AD:明哥,是不是又隻要記住public。
♂ 明世隱:對,public確實很常用,但是private也蠻經常用。
♀ 小AD:是不是跟排位排隊一樣的,沒排到之前大傢都可能排到,公共的。
♂ 明世隱:你咋啥都要往這方面想?
♀ 小AD:沒辦法,我天生麗質。private就是比如我兩雙排,固定組合,總不能把你T出去,我跟別人排吧。
♂ 明世隱:你這麼一說,我瞬間覺得以前我學代碼的時候,不香瞭。
♀ 小AD:那可不,我是人見人愛、花見花。。。
♂ 明世隱:花見花凋零!
非訪問控制修飾符
1.抽象方法控制符abstract
abstract 修飾的方法稱為抽象方法。抽象方法僅有方法頭,沒有方法體和具體實現。
2.靜態方法控制符static
指定不需要實例化就可以調用的一個方法,即在內存中隻有一份,通過類名即可調用。
3.最終方法控制符final
最終方法是功能和內部語句不能更改的方法,即最終方法不能重寫覆蓋。
4.本地方法控制符native
指定此方法的方法體是用其他語言在程序外部編寫的。
5.同步方法控制符synchronized
同步修飾符,在多個線程中,該修飾符用於在運行前,對它所屬的方法加鎖,以防止其他線程的訪問,運行結束後解鎖。
♂ 明世隱:abstract等後面講接口的時候來說明,我們比較常用就是 static 瞭。
♀ 小AD:這個我知道,main方法就是用static修飾的。
♂ 明世隱:用static修飾的調用就不需要每次都實例化,可以直接調用。
♀ 小AD:為啥不用實例化,我之前看你的調用方法都是要 new *** 這樣的 。
♂ 明世隱:嗯,new 類名 就是實例化,static 方法在類第一次加載的時候,static就已經在內存中瞭,直到程序結束後,該內存才會釋放。不需要再消耗資源反復創建對象。
♀ 小AD:我覺得我聽懂瞭。
♂ 明世隱:那你說說看
♀ 小AD:比如我們兩雙排,你邀請我後,每盤結束以後是不是不需要重新再拉我瞭,默認就在隊伍裡面,不需要你每次點擊邀請,重復力氣。(符合兩個條件:1.第一次就加載。2.不需要重復占用資源。)
♂ 明世隱:我草,給我個痛快吧,受不瞭瞭。
♀ 小AD:我這才學多久你就受不瞭瞭。
♂ 明世隱:我隻能說你是大聰明!
♀ 小AD:哥,我肯定你是在誇我。
♂ 明世隱:對對對!看一下static調用實例。
public class Learn9 { public static void main(String[] args) { System.out.println("learn9 main"); Learn9.test(); } static void test(){ System.out.println("learn9 static test"); } }
運行
修飾變量
1.public(公共訪問控制符),指定該變量為公共的,它可以被任何對象的方法訪問。
定義public變量a,看看訪問情況
在同類中
public class Learn10 { public int a=10; public static void main(String[] args) { System.out.println("learn10 main"); new Learn10().test(); } void test(){ System.out.println(a); } }
同包別的類
public class Learn9 { public static void main(String[] args) { System.out.println("learn9 main"); System.out.println(new Learn10().a ); } }
不同包中
import learnJava.Learn10; public class XiaoLuBan { public static void main(String[] args) { System.out.println(new Learn10().a ); } }
可以看到都是可以訪問的。
2.protected(保護訪問控制符)指定該變量可以別被自己的類和子類訪問。在子類中可以覆蓋此變量。
把變量a改成 protected
可以觀察到在其他包中不能訪問到
3.default(默認權限),指定該變量隻對同包可見,對不同包(含不同包的子類)不可見。
改成default,和上面的情況一樣(子類的情況先不管)
4.private(私有訪問控制符)指定該變量隻允許自己的類的方法訪問,其他任何類(包括子類)中的方法均不能訪問。
改成private後隻有本類中的方法可以訪問到這個變量。
5.final,最終修飾符,指定此變量的值不能變。
把a定義成final後,想對這個變量進行賦值操作,就會編譯錯誤。
6.static(靜態修飾符)指定變量被所有對象共享,即所有實例都可以使用該變量。變量屬於這個類。
♀ 小AD:明哥這次還是要重點關註public咯
♂ 明世隱:額。。不要一概而論,變量常用private修飾符。
♀ 小AD:那不是隻能在本類中才能訪問嗎?我其他類調用怎麼辦?
♂ 明世隱:你知道private隻能在本類中訪問,說明private你是熟悉瞭。
♀ 小AD:對啊 ,那怎麼取這個變量呢?
♂ 明世隱:用set get方法來存取呢。
♀ 小AD:那你還不是要把set get方法設置成public的嗎?有嘛區別?多此一舉。
♂ 明世隱:你有此問題,說明你是個愛動腦的娃兒,但是你段位怎麼就上不去瞭呢?
♀ 小AD:哥,你咋回事繞到那邊去瞭。
♂ 明世隱:意思就是說,我們一般不能直接開放給別人訪問變量,通過set get 訪問更安全,我們可以在set get方法中做相應的修飾,就不會被隨意的設置上值瞭。
實例1:
直接修改屬性方式
public class XiaoLuBan { private String yanzhi = ""; public static void main(String[] args) { XiaoLuBan xiaoLuBan = new XiaoLuBan(); xiaoLuBan.yanzhi="醜八怪"; System.out.println(xiaoLuBan.niDeYanZhi()); } public String niDeYanZhi(){ return yanzhi; } }
實例2:
通過set方式
public class XiaoLuBan { private String yanzhi = ""; public static void main(String[] args) { XiaoLuBan xiaoLuBan = new XiaoLuBan(); //xiaoLuBan.yanzhi="醜八怪"; xiaoLuBan.setYanzhi("醜八怪"); System.out.println(xiaoLuBan.niDeYanZhi()); } public void setYanzhi(String yanzhi) { if("美女".equals(yanzhi)){ this.yanzhi = yanzhi; }else if("五百年一遇的美女".equals(yanzhi)){ this.yanzhi = yanzhi; }else{ this.yanzhi = "大美女"; } } public String niDeYanZhi(){ return yanzhi; } }
♀ 小AD:原來是這樣啊,直接設置比較死板,還容易有問題。
♂ 明世隱:對啊,所以推薦set get方法來使用變量,變量設置為private。
♀ 小AD:比如你的錢,是私有的,如果設置為public的,那我可以拿瞭吧。
♂ 明世隱:你想的美,你問你嫂子拿去吧,我創建一個方法,通過你嫂子拿。
♀ 小AD:我怕我要被打。
♂ 明世隱:知道就好!哥給你展示一下怎麼用。
/** * 明哥類 * */ public class MingGe { private int money=10000000; public void getMoneyFromMingSao(String user) { System.out.println("明哥的資產:"+money); if("明哥".equals(user)){//如果是明哥,給1000 money-=1000; System.out.println("1000"); }else if("小魯班".equals(user)){//如果是小魯班,找打 System.out.println("找打吧你"); }else{ System.out.println("給你 0 元"); } System.out.println("取錢後明哥的資產:"+money); } public static void main(String[] args) { new MingGe().getMoneyFromMingSao("明哥"); } }
public class MingGe { private int money=10000000; public void getMoneyFromMingSao(String user) { System.out.println("明哥的資產:"+money); if("明哥".equals(user)){//如果是明哥,給1000 money-=1000; System.out.println("1000"); }else if("小魯班".equals(user)){//如果是小魯班,找打 System.out.println("找打吧你"); }else{ System.out.println("給你 0 元"); } System.out.println("取錢後明哥的資產:"+money); } public static void main(String[] args) { //new MingGe().getMoneyFromMingSao("明哥"); new MingGe().getMoneyFromMingSao("小魯班"); } }
♀ 小AD:明哥,你在傢裡的地位有那麼高嗎?我才不信
♂ 明世隱:你不看哥我是誰,哥拿捏的好。
♀ 小AD:切。。。,打排位還不讓嫂子知道,還說你拿捏的好。
♂ 明世隱:你不是一樣嗎,還說這個,今天你的星就免瞭,拜拜瞭您嘞。
♀ 小AD:不是哥、哎、哥。。。。。。哥。
總結
本篇文章就到這裡瞭,希望能給你帶來幫助,也希望您能夠多多關註WalkonNet的更多內容!