作者簡介
作者名:編程界明世隱
簡介:CSDN博客專家,從事軟體開發多年,精通Java、JavaScript,博主也是從零開始一步步把學習成長、深知學習和積累的重要性,喜歡跟廣大ADC一起打野升級,歡迎您關注,期待與您一起學習、成長、起飛!
系列目錄
從零學Java(9)之修飾符
從零學Java(8)之變數
從零學Java(7)之資料型別
從零學Java(6)之字面量和常量
從零學Java(5)之關鍵字和保留字
從零學Java(4)之編程規范
從零學Java(3)之第一個實體HelloWorld
從零學Java(2)之搭建開發環境
從零學Java(1)之面向物件
♀ 小AD:哥,幾天沒學Java了,我想學一下,感覺空空的,
♂ 明世隱:哦,還會主動要求學習了啊,不錯不錯!
♀ 小AD:沒辦法,我興趣上來了,既能輕松學習、又能快速上分,愛了愛了,
♂ 明世隱:打住,以后最后這幾個字以及類似的字,都是關鍵字,好吧,記住哦,
♀ 小AD:懂懂,嫂子回家了是吧,
♂ 明世隱:反正記住關鍵字就行了,
♀ 小AD:欺負我的時候不是很有一套嗎,我呸,,,,真是個渣男,
♂ 明世隱:打住,今天來學習Java修飾符,
♀ 小AD:哦,,,,.,,,,,

定義
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 | 主要用于執行緒的編程, |
修飾符的使用說明
修飾類
- public 將一個類宣告為公共類,他可以被任何物件訪問,一個程式的主類必須是公共類,一個.java檔案中只能有一個public類,而且檔案名必須與該類相同,
public class Learn9 {
public static void main(String[] args) {
}
}
假如類名與檔案名不一致

如果一個 .java 檔案中兩個public類呢?

報錯跟剛才一樣,就是公共類必須獨立占用一個java檔案,

把下面修飾類的public去掉就可以了,
♀ 小AD:明哥,我有個問題?
♂ 明世隱:請放!
♀ 小AD:文明點啊哥,就知道欺負人家,我就想說這一個類里面怎么還可以再放一個類的,也沒看到報錯,
♂ 明世隱:這個是可以的,就比如我可以帶你雙排、三排、5排,甚至可以,,,,但是你必須搞清楚誰是大哥,誰是小老弟,
♀ 小AD:哥我知道,你就是那個大哥,只有你可以拋頭露面、帶頭沖鋒,用public修飾,
♂ 明世隱:算你識相,不然我單排去了,
♀ 小AD:是是是,哥回頭請你吃奶茶!
♂ 明世隱:說謊的人要吞一千根針哦,
♀ 小AD:,,,
♂ 明世隱:一般也不這樣寫,寫成單獨的普通類,這種內部類寫法主要是一個功能模塊的方便或者相關的封裝,
♂ 明世隱:其實他們雖然放在一起,也只是編譯時概念,編譯完成后也是獨立的class檔案,
♀ 小AD:哦
♂ 明世隱:就比如剛才寫的代碼

-
默認的,把一個類宣告為默認的,可以被同一個包中的其他類使用,
-
abstract,將一個類宣告為抽象類,抽象類中可以有抽象方法,也可以沒有,抽象類只能被繼承不能被實體化,
-
final,將一個類宣告為最終(即非繼承類),表示他不能被其他類繼承,
-
外部類不能使用protected、private、static等修飾符,內部類可以使用,
♀ 小AD:我開始懵逼了,
♂ 明世隱:很正常,因為抽象類、最終類的你都沒接觸過,不過不要緊,你現階段只要有個印象,不需要去記,后面單獨再講這個,你只需要知道public修飾類就行了,
♀ 小AD:好,這樣就比較好弄,
修飾方法
訪問控制修飾符
- 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了,更別說其他包了,
- 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方法:

-
protected
把Learn10類中創建方法test改成protected的,然后發現跟上面的是一樣的,其他包中也不行,但實際上這個在子類中是可以的,子類的問題下次再研究, -
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:那可不,我是人見人愛、花見花,,,
♂ 明世隱:花見花凋零!
非訪問控制修飾符
-
抽象方法控制符abstract
abstract 修飾的方法稱為抽象方法,抽象方法僅有方法頭,沒有方法體和具體實作, -
靜態方法控制符static
指定不需要實體化就可以呼叫的一個方法,即在記憶體中只有一份,通過類名即可呼叫, -
最終方法控制符final
最終方法是功能和內部陳述句不能更改的方法,即最終方法不能重寫覆寫, -
本地方法控制符native
指定此方法的方法體是用其他語言在程式外部撰寫的, -
同步方法控制符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");
}
}
運行

修飾變數
- 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 );
}
}
可以看到都是可以訪問的,
-
protected(保護訪問控制符)指定該變數可以別被自己的類和子類訪問,在子類中可以覆寫此變數,
把變數a改成 protected


可以觀察到在其他包中不能訪問到 -
default(默認權限),指定該變數只對同包可見,對不同包(含不同包的子類)不可見,
改成default,和上面的情況一樣(子類的情況先不管) -
private(私有訪問控制符)指定該變數只允許自己的類的方法訪問,其他任何類(包括子類)中的方法均不能訪問,


改成private后只有本類中的方法可以訪問到這個變數, -
final,最終修飾符,指定此變數的值不能變,
把a定義成final后,想對這個變數進行賦值操作,就會編譯錯誤,

-
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:不是哥、哎、哥,,,,,,哥,

小結
這節學習了Java修飾符的知識,希望能對大家有所幫助,請各位小伙伴幫忙 【點贊】+【收藏】+ 【評論區打卡】, 如果有興趣跟小明哥一起學習Java的,【關注一波】不迷路哦,
相關閱讀
1. Java俄羅斯方塊
2. 老Java程式員花2天寫了個連連看
3. 老Java程式員花一天時間寫了個飛機大戰
4. JavaWeb圖書管理系統
5. JavaWeb學生宿舍管理系統
6. JavaWeb在線考試系統
為了幫助更多小白從零進階 Java 工程師,從CSDN官方那邊搞來了一套 《Java 工程師學習成長知識圖譜》,尺寸 870mm x 560mm,展開后有一張辦公桌大小,也可以折疊成一本書的尺寸,原件129元現價 29 元,先到先得,有興趣的小伙伴可以了解一下!

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/289855.html
標籤:java
上一篇:精選力扣500題 第65題 LeetCode 322. 零錢兌換【c++/java詳細題解】
下一篇:Spring 學習以及總結(一)
