Java基礎(4)-Java識別符號和關鍵字
本文為joshua317原創文章,轉載請註明:轉載自joshua317部落格https://www.joshua317.com/article/173
任何一種計算機語言都離不開識別符號和關鍵字,今天我們來介紹下Java 的識別符號、關鍵字和保留字。
一、識別符號
在Java語言中,類、物件、方法、變數、介面和自定義資料型別等都有自己的名字,我們把這些名字統稱為識別符號。
1.1 識別符號的命名規則
- 識別符號由數字(0~9)和字母(A~Z 和 a~z)、美元符號($)、下劃線(_)
- 識別符號的第一個符號為字母、下劃線和美元符號,不能以數字開頭,後面可以是任何字母、數字、美元符號或下劃線
- Java嚴格區分大小寫
- 識別符號中不能出現空格
- 識別符號的長度可以是任意的(在java虛擬機器規範中,識別符號是有長度限制的)
- 關鍵字不能作為識別符號
- 識別符號不能和**Java中預定義的字面常量(true、false、null)**名稱相同
1.2 識別符號的命名規範
阿里《Java開發手冊-泰山版》
下載地址
連結:https://pan.baidu.com/s/1b4cOdXWA3wF1KMRZP2ZYmg
提取碼:iigm
1. 【強制】程式碼中的命名均不能以下劃線或美元符號開始,也不能以下劃線或美元符號結束。 反例:_name / __name / $name / name_ / name$ / name__ 2. 【強制】所有程式設計相關的命名嚴禁使用拼音與英文混合的方式,更不允許直接使用中文的方式。 說明:正確的英文拼寫和語法可以讓閱讀者易於理解,避免歧義。注意,純拼音命名方式更要避免採用。 正例:ali / alibaba / taobao / cainiao/ aliyun/ youku / hangzhou 等國際通用的名稱,可視同英文。 反例:DaZhePromotion [打折] / getPingfenByName() [評分] / int 某變數 = 3 3. 【強制】類名使用 UpperCamelCase 風格,但以下情形例外:DO / BO / DTO / VO / AO / PO / UID 等。 正例:ForceCode / UserDO / HtmlDTO / XmlService / TcpUdpDeal / TaPromotion 反例:forcecode / UserDo / HTMLDto / XMLService / TCPUDPDeal / TAPromotion 4. 【強制】方法名、引數名、成員變數、區域性變數都統一使用 lowerCamelCase 風格。 正例: localValue / getHttpMessage() / inputUserId 5. 【強制】常量命名全部大寫,單詞間用下劃線隔開,力求語義表達完整清楚,不要嫌名字長。 正例:MAX_STOCK_COUNT / CACHE_EXPIRED_TIME 反例:MAX_COUNT / EXPIRED_TIME 6. 【強制】抽象類命名使用 Abstract 或 Base 開頭;異常類命名使用 Exception 結尾;測試類 命名以它要測試的類的名稱開始,以 Test 結尾。 7. 【強制】型別與中括號緊挨相連來表示陣列。 正例:定義整形陣列 int[] arrayDemo; 反例:在 main 引數中,使用 String args[]來定義。 8. 【強制】POJO 類中的任何布林型別的變數,都不要加 is 字首,否則部分框架解析會引起序列 化錯誤。 說明:在本文 MySQL 規約中的建表約定第一條,表達是與否的值採用 is_xxx 的命名方式,所以,需要在 <resultMap>設定從 is_xxx 到 xxx 的對映關係。 反例:定義為基本資料型別 Boolean isDeleted 的屬性,它的方法也是 isDeleted(),框架在反向解析的時 候,“誤以為”對應的屬性名稱是 deleted,導致屬性獲取不到,進而丟擲異常。 9. 【強制】包名統一使用小寫,點分隔符之間有且僅有一個自然語義的英語單詞。包名統一使用 單數形式,但是類名如果有複數含義,類名可以使用複數形式。 正例:應用工具類包名為 com.alibaba.ei.kunlun.aap.util、類名為 MessageUtils(此規則參考 spring 的 框架結構 10.【強制】避免在子父類的成員變數之間、或者不同程式碼塊的區域性變數之間採用完全相同的命名, 使可讀性降低。 說明:子類、父類成員變數名相同,即使是 public 型別的變數也是能夠通過編譯,而區域性變數在同一方法 內的不同程式碼塊中同名也是合法的,但是要避免使用。對於非 setter/getter 的引數名稱也要避免與成員變 量名稱相同。 反例: public class ConfusingName { public int stock; // 非 setter/getter 的引數名稱,不允許與本類成員變數同名 public void get(String alibaba) { if (condition) { final int money = 666; // ... } for (int i = 0; i < 10; i++) { // 在同一方法體中,不允許與其它程式碼塊中的 money 命名相同 final int money = 15978; // ... } } } class Son extends ConfusingName { // 不允許與父類的成員變數名稱相同 public int stock; } 11.【強制】杜絕完全不規範的縮寫,避免望文不知義。 反例:AbstractClass“縮寫”命名成 AbsClass;condition“縮寫”命名成 condi,此類隨意縮寫嚴重降 低了程式碼的可閱讀性。 12.【推薦】為了達到程式碼自解釋的目標,任何自定義程式設計元素在命名時,使用盡量完整的單片語 合來表達。 正例:在 JDK 中,對某個物件引用的 volatile 欄位進行原子更新的類名為:AtomicReferenceFieldUpdater。 反例:常見的方法內變數為 int a;的定義方式。 13.【推薦】在常量與變數的命名時,表示型別的名詞放在詞尾,以提升辨識度。 正例:startTime / workQueue / nameList / TERMINATED_THREAD_COUNT 反例:startedAt / QueueOfWork / listName / COUNT_TERMINATED_THREAD 14.【推薦】如果模組、介面、類、方法使用了設計模式,在命名時需體現出具體模式。 說明:將設計模式體現在名字中,有利於閱讀者快速理解架構設計理念。 正例: public class OrderFactory; public class LoginProxy; public class ResourceObserver; 15.【推薦】介面類中的方法和屬性不要加任何修飾符號(public 也不要加),保持程式碼的簡潔 性,並加上有效的 Javadoc 註釋。儘量不要在接口裡定義變數,如果一定要定義變數,確定 與介面方法相關,並且是整個應用的基礎常量。 正例:介面方法簽名 void commit(); 介面基礎常量 String COMPANY = "alibaba"; 反例:介面方法定義 public abstract void f(); 說明:JDK8 中介面允許有預設實現,那麼這個 default 方法,是對所有實現類都有價值的預設實現。 16.介面和實現類的命名有兩套規則: 1)【強制】對於 Service 和 DAO 類,基於 SOA 的理念,暴露出來的服務一定是介面,內部的實現類用 Impl 的字尾與介面區別。 正例:CacheServiceImpl 實現 CacheService 介面。 2)【推薦】如果是形容能力的介面名稱,取對應的形容詞為介面名(通常是–able 的形容詞)。 正例:AbstractTranslator 實現 Translatable 介面。 17.【參考】列舉類名帶上 Enum 字尾,列舉成員名稱需要全大寫,單詞間用下劃線隔開。 說明:列舉其實就是特殊的常量類,且構造方法被預設強制是私有。 正例:列舉名字為 ProcessStatusEnum 的成員名稱:SUCCESS / UNKNOWN_REASON。 18.【參考】各層命名規約: A) Service/DAO 層方法命名規約 1) 獲取單個物件的方法用 get 做字首。 2) 獲取多個物件的方法用 list 做字首,複數結尾,如:listObjects。 3) 獲取統計值的方法用 count 做字首。 4) 插入的方法用 save/insert 做字首。 5) 刪除的方法用 remove/delete 做字首。 6) 修改的方法用 update 做字首。 B) 領域模型命名規約 1) 資料物件:xxxDO,xxx 即為資料表名。 2) 資料傳輸物件:xxxDTO,xxx 為業務領域相關的名稱。 3) 展示物件:xxxVO,xxx 一般為網頁名稱。 4) POJO 是 DO/DTO/BO/VO 的統稱,禁止命名成 xxxPOJO。
識別符號用來命名常量、變數、類和類的物件等。因此,一個良好的程式設計習慣要求命名識別符號時,應賦予它一個有意義或有用途的名字。
二、關鍵字
在Java語言中有些識別符號是有著特殊含義的,而我們把這些有著特殊含義的識別符號稱為關鍵字,有時也叫保留字。關鍵字(或者保留字)是對編譯器有特殊意義的固定單詞,一般用於表示一種資料型別,或者表示程式的結構,不能在程式中做其他目的使用。關鍵字具有專門的意義和用途,和自定義的識別符號不同,不能當作一般的識別符號來使用。
**特點:**關鍵字中所有字母都為小寫。
2.1 系統預留關鍵字有哪些
Java 語言目前定義了 48個關鍵字 ,2個保留字,3個預定義常量。這些關鍵字不能作為變數名、類名和方法名來使用。
48個關鍵字:abstract、assert、boolean、break、byte、case、catch、char、class、continue、default、do、double、else、enum、extends、final、finally、float、for、if、implements、import、int、interface、instanceof、long、native、new、package、private、protected、public、return、short、static、strictfp、super、switch、synchronized、this、throw、throws、transient、try、void、volatile、while。 2)2個保留字(現在沒用以後可能用到作為關鍵字):goto、const。 3)3個預定義常量:true、false、null。
abstract | assert | boolean | break | byte |
---|---|---|---|---|
case | catch | char | class | continue |
default | do | double | else | enum |
extends | final | finally | float | for |
if | implements | import | int | interface |
instanceof | long | native | new | package |
private | protected | public | return | short |
static | strictfp | super | switch | synchronized |
this | throw | throws | transient | try |
void | volatile | while | goto | const |
true | false | null |
2.2 關鍵字的含義
關鍵字 | 含義 |
---|---|
abstract | 表明類或者成員方法具有抽象屬性 |
assert | 斷言,用來進行程式除錯 |
boolean | 基本資料型別之一,宣告布林型別的關鍵字 |
break | 提前跳出一個塊 |
byte | 基本資料型別之一,位元組型別 |
case | 用在switch語句之中,表示其中的一個分支 |
catch | 用在異常處理中,用來捕捉異常 |
char | 基本資料型別之一,字元型別 |
class | 宣告一個類 |
const | 保留關鍵字,沒有具體含義 |
continue | 回到一個塊的開始處 |
default | 預設,例如,用在switch語句中,表明一個預設的分支。Java8 中也作用於宣告介面函式的預設實現 |
do | 用在do-while迴圈結構中 |
double | 基本資料型別之一,雙精度浮點數型別 |
else | 用在條件語句中,表明當條件不成立時的分支 |
enum | 列舉 |
extends | 表明一個型別是另一個型別的子型別。對於類,可以是另一個類或者抽象類;對於介面,可以是另一個介面 |
final | 用來說明最終屬性,表明一個類不能派生出子類,或者成員方法不能被覆蓋,或者成員域的值不能被改變,用來定義常量 |
finally | 用於處理異常情況,用來宣告一個基本肯定會被執行到的語句塊 |
float | 基本資料型別之一,單精度浮點數型別 |
for | 一種迴圈結構的引導詞 |
goto | 保留關鍵字,沒有具體含義 |
if | 條件語句的引導詞 |
implements | 表明一個類實現了給定的介面 |
import | 表明要訪問指定的類或包 |
instanceof | 用來測試一個物件是否是指定型別的例項物件 |
int | 基本資料型別之一,整數型別 |
interface | 介面 |
long | 基本資料型別之一,長整數型別 |
native | 用來宣告一個方法是由與計算機相關的語言(如C/C++/FORTRAN語言)實現的 |
new | 用來建立新例項物件 |
package | 包 |
private | 一種訪問控制方式:私用模式 |
protected | 一種訪問控制方式:保護模式 |
public | 一種訪問控制方式:共用模式 |
return | 從成員方法中返回資料 |
short | 基本資料型別之一,短整數型別 |
static | 表明具有靜態屬性 |
strictfp | 用來宣告FP_strict(單精度或雙精度浮點數)表示式遵循[IEEE 754](https://baike.baidu.com/item/IEEE754)算術規範 |
super | 表明當前物件的父型別的引用或者父型別的構造方法 |
switch | 分支語句結構的引導詞 |
synchronized | 表明一段程式碼需要同步執行 |
this | 指向當前例項物件的引用 |
throw | 丟擲一個異常 |
throws | 宣告在當前定義的成員方法中所有需要丟擲的異常 |
transient | 宣告不用序列化的成員域 |
try | 嘗試一個可能丟擲異常的程式塊 |
void | 聲明當前成員方法沒有返回值 |
volatile | 表明兩個或者多個變數必須同步地發生變化 |
while | 用在迴圈結構中 |
goto | 指定跳轉到標籤,找到標籤後,程式將處理從下一行開始的命令 |
const | 用於修改欄位或區域性變數的宣告。它指定欄位或區域性變數的值是常數,不能被修改 |
true | 布林值真 |
false | 布林值假 |
null | 空 |
2.3 關鍵字按用途分組
資料型別(8):byte、short、int、long、boolean、float、double、char 流程控制(10):if、else、do、while、for、switch、case、default、break、continue 修飾符(12):public、protected、private、final、void、static、strict、abstract、transient、synchronized、volatile、native
方法、類、介面、包、異常等(17):enum、class、interface、package、import、extends、implements、this、supper、instanceof、new、throw、throws、try、catch、finally、return 其他(6):assert、true、false、null、goto、const
本文為joshua317原創文章,轉載請註明:轉載自joshua317部落格https://www.joshua317.com/article/173