文章目錄
一、final
final
最終的,最後的,不可變的
- final的四種應用場景:
-
修飾類 : 太監化,不能有子類
與abstract關鍵字矛盾(抽象類不能直接用,一定要有子類)
-
修飾成員方法 : 最終方法,不能被覆蓋重寫
與abstract關鍵字矛盾(抽象方法一定要覆蓋重寫,所以衝突)
-
修飾局部變量(局部常量) :只能賦值一次
對於基本數據類型而言,不可變指:值不可變
對於引用數據類型而言,不可變指:地址不可變
-
修飾全局變量(全局常量) :在創建時就必須手動賦值(使用final關鍵字,不會再有默認值,所以需要手動賦值)。要麼使用直接賦值 ,要麼通過構造方法 賦值
二、命名規範&註釋模板
1. 命名規範
1.1 通用規定
類別 | 命名規範 |
---|---|
項目名 | 全部小寫 |
包名 | 全部小寫 |
類名 | 大駝峯 |
變量名,方法名 | 小駝峯 |
常量名 | 全部大寫,下劃線分隔 |
所有命名規則必須遵循以下規則 :
- 名稱只能由字母、數字、下劃線、$符號組成.
- 不能以數字開頭.
- 名稱不能使用Java中的關鍵字.
- 堅決不允許出現中文及拼音命名.
1.2 包名規定
在Java編程規範中要求開發人員在自己定義的包名前加上唯一的前綴(爲了保障每個Java Package命名的唯一性)。由於互聯網上的域名稱是不會重複的,所以多數開發人員採用自己公司在互聯網上的域名稱(一般是反過來用,比如com.baidu
)作爲自己程序包的唯一前綴
com
:公司項目,copyright由項目發起的公司所有.
包名 : com.公司名.項目名.模塊名team
: 團隊項目,指由團隊發起,並由該團隊開發的項目,copyright屬於該團隊所有.
包名 : team.團隊名.項目名.模塊名
-
indi
: 個體項目,指個人發起,但非自己獨自完成的項目,可公開或私有項目,copyright主要屬於發起者(也有公司寫作onem
)
包名 : indi.發起者名.項目名.模塊名… -
pers
: 個人項目,指個人發起,獨自完成,可分享的項目,copyright主要屬於個人.
包名 : pers.個人名.項目名.模塊名… -
priv
: 私有項目,指個人發起,獨自完成,非公開的私人使用的項目,copyright屬於個人.
包名 : priv.個人名.項目名.模塊名
2. 註釋模板
2.1 類註釋
2.2 屬性註釋
2.3 方法註釋
2.4 構造方法註釋
三、權限修飾符
四類分別對應: 我自己 、我鄰居 、 我兒子 、 陌生人
private
私有的意思,只能自己內部調用(default)
缺失的意思,之前說過,同包連導包語句都可省,省個權限修飾符也沒什麼毛病吧protected
保護的,父子間血脈是受保護的
四、內部類
一個類內部,包含另一個類。這個裏面的類,就叫做內部類
爲什麼要有內部類?心臟
可以看做一個類吧?脫離了身體
類,它就沒有意義。所以心臟類
就是一個內部類。
分類:
- 成員內部類
- 局部內部類(包含匿名內部類)
1. 內部類的定義格式
內部類和外部類的格式一模一樣
public class 內部類名稱 {}
-
注意: 內部類可以隨意訪問外部類,外部類需要藉助內部類對象
-
可以看到13行定義了一個外部類私有方法,8行的內部類調用成功(沒標紅報錯)
-
19~23外部類調用內部類方法,需要先創建了內部類對象
2. 內部類的使用
內部類的使用,可以分爲間接使用 和直接使用 兩種方式
-
間接使用: 通過外部類方法調用內部類方法
可以採取匿名對象的方式
-
直接使用: 直接創建內部類對象,再調用方法
// 直接使用的格式
外部類.內部類 對象名 = new 外部類().new 內部類();
- 類文件
- 運行文件
提示:內部類的編譯
內部類究竟是怎樣的存在?或者說,內部類究竟在編譯過程中,發生了什麼?
- 打開
out
文件夾(裏面放着編譯後的.class
文件)
- 找到項目文件夾
- 查看
- 發現: 內部類的命名利用了
外部類$內部類
的形式
3. 重名變量訪問
外部類訪問內部類很好辦,因爲要通過內部類對象。
內部類如何訪問外部類的重名變量呢?
外部類名.this.重名變量;
4. 局部內部類
局部內部內核成員內部類就是放的位置不一樣,注意這個內部類只能在這個方法內。
小提示: 其實可以通過這個方法,return一個Object,然後向下轉型。但是這樣做很麻煩,不提倡。
5. 類的權限修飾符
- 外部類:
public
、(default)
外部類,私有化還有意義嘛?(不能調用) - 成員內部類:
public
、protected
、(default)
、private
- 局部內部類: 啥都不能寫(不是
(default)
的意思)
6. 局部內部類的final問題
- new出來的對象在堆當中
- 成員方法在棧中
- 成員方法運行完畢,出棧,局部變量消失
- 對象要等垃圾回收才失效
問題來了: 如果這個局部內部類要用局部變量咋辦?局部變量消失後
解決辦法: 讓這個局部內部類,把需要的局部變量複製一份(當然這個複製的動作不需要我們做)。如果這個局部變量會變的話,複製哪個?所以,不能讓它變,要加上final
關鍵字
從
Java8
開始,final
可以省略不寫。(這叫【有效final】)
7. 匿名內部類 【重點!】
如果接口的實現類(或子類)只需要使用一次,就可以使用匿名內部類
接口名稱 對象名 = new 接口名稱() {
// 重寫所有抽象方法
}
-
先定義一個接口
-
通過【匿名內部類】直接調用(藍底就是匿名內部類),注意結尾的分號
-
調用方法,結果
注意
匿名內部類省略的是類名稱 (省略了實現類/子類名稱),而不是對象名稱 。下面這個兩個都省了,叫做匿名對象匿名內部類
new 接口名稱() {
// 重寫所有抽象方法
}
匿名內部類 是在創建對象時,只能使用唯一一次
匿名對象 是在調用方法時,只能使用唯一一次
8. 類作爲成員變量類型
以下爲了方便,我沒有使用標準格式(私有化+Getter/Setter,這樣代碼看上去也不至於凌亂)
- 創建一個武器類
- 創建一個英雄類 (武器類作爲數據類型)
- 運行
9. 接口作爲成員變量類型
- 接口
- 用接口作爲成員變量類型
- 運行
當然,還可以使用匿名對象進一步簡化
五、Test:繼續發紅包
1. 準備複製
素材在我上傳的文件裏,包括圖片和接口。
2. 紅包實現
2.1 創建紅包
- 創建一個新文件,創建RedPacketFrame類對象,發現是一個抽象類。所以下一步要創建一個它的實現類
- 出現紅線,按
Alt 回車
,選擇第一項。按照提示,在運行文件中創建實現類實例並傳入參數“標題”
2.2 測試程序
- 直接運行
- 金額、個數、留言都沒問題。塞錢進紅包也沒問題
- 點擊頁面上的元素,看看哪些功能沒完成
2.3 實現平均紅包
- 按照提示,輸入羣主名稱
- 設置打開方式,發現要使用OpenMode接口
- 創建這個接口的實現AvergeMode
- 創建接口實現對象,並傳入
2.4 隨機紅包
關鍵就是創建一個新的接口實現類(注意觀看註釋,這應該是最接近隨機的一種方法了)