Java語言規範、API、JDK、IDE的含義:
Java語言規範是Java語法和語義技術性定義,API是應用程序接口(Java預定義類和接口),Java開發工具包(JDK)包含軟件庫、編譯器、解釋器以及其他工具,集成開發環境(IDE)提供編輯、編譯、調試和在線幫助功能。
Java平台版本:
- Java SE:允許開發和部署在桌面、服務器和嵌入式環境和實時環境中使用的Java應用程序。
- Java EE:它幫助開發和部署可移植、健壯、可伸縮且安全的服務器端Java應用程序。Java EE是在Java SE的基礎上構建的,它提供web服務、組件模型、管理和通信API。
- Java ME:它為在移動設備和嵌入式設備上運行的應用程序提供一個健壯且靈活的環境。
Java運行環境
Java的目標代碼可以在任何平台上運行,Java的源代碼編譯之後生成.class文件,由字節碼構成(比如博客之前安卓逆向研究的Dalvik字節碼)。字節碼可以在任何裝有Java虛擬機的計算機上運行,Java虛擬機是一個用於解釋字節碼的軟件。
Java程序剖析:
- 注釋:Java程序包含三種注釋,即多行注釋、單行注釋、文檔注釋,多行注釋,
/* 注釋內容注釋內容/
單行注釋://文檔注釋:可以用javadoc提取注釋,形成文檔,/** 注釋內容
*/ - 修飾符:常見如public, protected, private, static, abstract, final,用於指定數據、方法、類的屬性以及它們的用法。
- 類:是Java的基本結構,一個程序可以包含一個或多個類,一個Java源文件里最多只有一個公有類。
- main方法:Java解釋器通過調用main方法執行應用程序。
常量:
- 一旦初始化後就不能再改變的數據,語法為final datatype CONSTANT_NAME = value;
Java數據類型
- Java數據類型:包括基本類型和引用類型,
基本類型包括 整數類型(byte, short, int, long) 字符類型(char)浮點類型(float, double)邏輯類型(boolean);引用類型包括 類,接口,數組。其中,浮點數中以d或D結尾或者無後綴表示double類型,以f或F結尾的表示float類型;整數字面值中以l或L結尾的表示long類型,其他表示int類型。 - Java數值類型轉換:
如果有一個操作數是double類型,另一個操作數轉換為double 類型;否則,如果有一個操作數是float類型,另一個操作數轉換為float類型;否則,如果有一個操作數是long類型,另一個操作數轉換為long類型;否則,兩個操作數都轉換為int類型;數據轉換總是向較大範圍的數據類型轉換,避免精度損失。
將值賦值給較大取值範圍的變量時,自動進行類型轉換;
將值賦值給較小取值範圍的變量時,必須使用強制類型轉換。 - 字符數據類型:char表示16位的單個Unicode字符,char類型的字面值 包括以兩個單引號界定的單個Unicode字符,可以用\uxxxx形式表示的, 轉義字符表示\n \t \b \r \f \ ` ” 。
編程風格:
良好的編程風格有利於減少錯誤,產生容易閱讀、易於理解的代碼。類和方法前使用文檔注釋,方法步驟前使用行注釋;變量和方法名使用小寫,如果有多個單詞,第一個單詞首字母小寫,其他單詞首字母大寫;類名的每個單詞的首字母大寫;常量使用大寫,單詞間以下劃線分割。
Java常見錯誤類型:
包括語法錯誤,即在編譯期間產生的錯誤;運行時錯誤,導致程序非正常終止的錯誤;邏輯錯誤,程序不能按預期的方式執行,編譯不會報錯。
條件語句:
包括If語句、switch語句、條件表達式,其中的if語句判斷條件必須是boolean類型的;在if-else條件語句中,else語句與同一塊中最近的if語句匹配。在使用條件語句中,避免在條件表達式中使用比較操作符判斷布爾變量的真假。switch語句的判斷條件expression的計算結果只能是byte, char, short, int。value1-valueN必須與 判斷條件類型相同,且為常量表達式,不能是變量。
Java中常用的數學函數:
- Math.random方法生成[0.0,1.0)之間的double類型的隨機數,可以用它寫出簡單的表達式來生成任意範圍的隨機數,一般地,a + (int)(Math.random() * b)返回[a, a+b);還可以用該方法生成隨機字符,Java中每個字符對應一個Unicode編碼從0000到FFFF,在生成一個隨機字符,就是產生一個0到65535之間的隨機數,所以計算的表達式為(int)(Math.random() * (65535+1))。生成任意2個字符ch 1和ch2(ch1 < ch2)之間的隨機字符,
(char)(ch1 + (int)(Math.random() * (ch2 – ch1 + 1)))
字符數據類型和操作
- 在字符型數據和數值類型數據之間轉換時,如果轉換結果適用於目標變量(不會有精度損失),可以採用隱式轉換;否則必須使用強制類型轉換。
- 所有數值運算符都可以用在char型操作數上,如果另一個操作數是數值或字符,那麼char型操作數就自動轉換為數值;如果另一個操作數是字符串,那麼char型操作數就會自動轉換成字符串再和另外一個操作數字符串相連。
字符串類型
String類型是不可變的,其內容是不可修改的;如以下代碼片段:
String s = "java";
s = "HTML";
12
其中s可以理解為一個對象指針,其指向對象空間,其中的字符串為java,第二句賦值只是將s指向了另一個對象空間。
- equals方法用於比較兩個字符串是否包含相同的內容。
- equalsIngoreCase忽略大小寫比較內容是否相同。
- regionMatch比較部分內容是否相同。
- startsWith判斷是否以某個字符串開始。
- endsWith判斷是否以某個字符串結束。
- compareTo方法用於比較兩個字符串的大小,即第一個不同字符的差值.
- 調用length()方法可以獲取字符串的長度。。
- charAt(index)方法可以獲取指定位置的字符,index必須位於0到s.length()-1之間。
- concat()方法用於連接兩個字符串,連接操作返回一個新的字符串。
- indexOf返回字符串中字符或字符串匹配的位置,返回-1表示未找到。indexOf指定第二個參數表示從指定的位置開始查找。
- toCharArray將字符串轉換成字符數組。valueOf方法將基本數據類型轉換為字符串,例如轉化為字符串,如
String s1 = String.valueOf(1.0); String s2 = String.valueOf(true);;字符串轉換為基本數據類型,Double.parseDouble(str)等。
方法:
- 方法簽名指方法名稱、參數類型、參數數量和返回類型;==一個類中不能包含簽名相同或僅返回類型不同的多個方法;==方法頭中聲明的變量稱為形參,**形參可以使用final修飾,表示方法內部不允許修改該參數;**形參不允許有默認值,最後一個可為變長參數。方法可以有返回值,構造函數沒有返回值。
- 如果方法聲明中含有形參,調用方法時必須提供實參,實參的類型必須與形參的類型兼容:如父類形參可用子類實參。
- 調用方法時,基本數據類型的實參值的副本被傳遞給方法的形參,方法內部對形參的修改不影響實參值;對象類型的參數是引用調用。
方法重載:
- 方法重載是指方法名稱相同,但方法簽名不同的方法,僅返回類型不同不可重載。一個類中可以包含多個重載的方法。
- 當調用方法時,Java編譯器會根據實參的個數和類型尋找最準確的方法進行調用;調用時匹配的方法多於一個,則會產生編譯錯誤,成為歧義調用。
數組:
- 數組是引用類型。
- 多維數組只是數組的數組,故數組元素也可能是引用類型變量
- 凡使用new後,內存單元都初始化為0或Null。
- 聲明數組引用變量,datatype[] arrayRefVar;,任何實例化的數組都是Object的子類。
- 數組變量是引用類型的變量,聲明數組變量並不分配內存空間,必須通過new實例化來分配內存空間。
- 新創建的數組其元素根據類型被初始化為默認的初始值,數值類型為0字符類型為’\u0000’布爾類型為false引用類型為null
- 數組可以在聲明的括號後提供初始值,double[] mylist = {1.9, 2.9, 3, 3.5};或者double[] mylist = new double[]{1.9, 2.9, 3, 3.5};
- 數組的大小在創建這個數組之後不能被改變,arrayRefVar.length可以訪問數組的長度。
- 直接使用賦值語句不能實現數組複製,結果是兩個數組引用變量指向同一個數組對象。在將數組作為實參傳遞給方法時,修改形參引用的數組,將改變實參引用的數組。
- JVM將數組存儲在叫堆的內存區域里,數組引用存儲在棧空間中。
- String傳遞給方法:由於實參的字符序列不可修改,將克隆給形參。
- 可以把類型相同,但個數可變的參數傳遞給方法,方法中的參數聲明為typeName…parameterName,==Java將可變長參數當數組看待,通過length屬性得到可變參數的個數。
print(String...args){ //可看作String[] args
for(String temp: args)
System.out.println(temp);
System.out.println(args.length);
}
12345
- java.util.Arrays類包括各種靜態方法,其中實現了數組的排序和查找,即sort方法與binarySearch方法。
- 二維數組的每個元素(數組)的長度可以不同,創建二維不規則數組時,可以只指定第一維下標,第一維的每個元素為null, 必須為每個元素使用new創建數組。
面向對象思考:
- 類間的關係描述方法,關聯關係:是一種通用的二元關係,對象間通過活動發生聯繫,例如學生選學課程,教師教授課程。==在Java中,關聯關係可以用數據域或方法來實現,對於方法,一個類中的方法包含另一個類作為參數。
- 聚合關係是一種擁有關係,表示整體與部分之間的關係,即Has-a的關係,在聚合關係中,一個對象可以被多個聚集着擁有; 組合關係是一種隸屬關係,一個從屬者只能被一個聚集着擁有。如一個Name對象只能為一個Person所擁有,但一個Address對象可以被多個Person所共享。
- 繼承關係,表示子類與父類之間的is-a關係,通過繼承,子類可以重用父類的數據和代碼。
- 實現關係,表示接口和類之間的關係,類實現接口。
繼承:
繼承是一種軟件重用,如果沒有繼承,會出現很多重複定義。語法為:
class ClassName extends Superclass{
classbody
}
123
子類繼承了父類中可訪問的數據域和方法,子類也可添加新的數據域和方法,子類不繼承符類的構造函數。一個子類只能有一個直接父類:單繼承。子類繼承的父類的私有屬性不能訪問,但是可以通過所繼承的get和set公有方法設置和訪問。
- 當第一次創建子類對象時,首先初始化其父類靜態成員變量(如果沒有父類對象),然後初始化當前子類對象的靜態成員變量。注意:第一次之後創建子類對象時,不會再次初始化父類和子類的靜態成員變量。其實,靜態成員變量在有任何實例變量對象之前已經存在。
接着執行該子類對象的父類的構造函數super(…),可能是編譯為父類提供的默認無參構造函數super()。然後執行子類實例變量定義時的初始化表達式,若定義時未給出初始值,則默認為0或null.最後執行子類構造函數中super(…)後面的語句。 - super關鍵字:super調用父類的構造函數,必須是子類構造函數的第一條且僅一條語句(先構造父類),如果子類構造函數中沒有顯示地調用父類的構造函數,那麼將自動調用父類不帶參數的構造函數。 如果父類屬性或方法可以在子類訪問,則使用super.data或者super.method(parameters)進行訪問。
- super與無參構造函數:如果一個類自定義了構造函數(不管有無參數),系統不會自動加上無參構造函數; 反之,如果沒定義則會加上。編譯在為子類添加無參構造函數時,用super()默認調用父類的無參構造函數,如果找不到父類的無參構造函數,則子類添加無參構造函數失敗。 所以,如果一個類定義了帶參數的構造函數,一定別忘了定義一個無參構造函數。
實例方法覆蓋
- 如果子類重新定義了從父類中繼承的實例方法,稱為方法覆蓋。
- 僅當方法是**可訪問的實例方法**時,才能被覆蓋,即私有實例方法不能被覆蓋,私有方法自動視為final. (final修飾類時表示其不可被繼承;修飾方法表示不可在子類中被重寫;修飾成員變量時表示只能在聲明處或者構造函數中初始化一次)。
- 靜態方法不能被覆蓋,如果靜態方法在子類中重新定義,那麼父類方法將被隱藏。
- 一旦父類中的方法被覆蓋,則不能通過引用的子類對象訪問被覆蓋的父類方法。在子類類體函數中可以使用super引用被覆蓋的父類方法。
- 隱藏和覆蓋的區別:覆蓋,子類對象被父類引用變量引用,父類引用變量調用的相同簽名的函數是子類函數(不能發現父類函數,晚期綁定);隱藏,同上,但父類引用變量訪問的是父類變量、函數(可以在發現)。
- 子類方法同樣可以與父類中可訪問的方法構成重載。
多態和動態綁定:
重載發生在編譯時,編譯時編譯器根據方法簽名找到最合適的方法;多態發生在運行時,運行時JVM根據變量所引用的對象的真正類型來找到最合適的實例方法。多態是晚期綁定,綁定是指找到函數的入口地址的過程。
訪問控制符和修飾符final
成員修飾符本類本包子類它包publicyyyyprotectedyyyn無(package)yynnprivateynnn
- 父類私有成員在子類不可見;
- 父類公有和保護成員在子類可見
- 繼承到子類後不改變父類成員的訪問權限。
異常處理:
- 一般而言,帶有異常處理的程序會寫成try…catch的形式;在try體內完成程序的正常處理流程,在catch體內完成異常處理。
- 若正常的異常處理出現錯誤,則使用”throw <異常對象引用>”拋出異常;拋出的異常由catch捕獲,未被捕獲的異常逐層傳播到main,如果main也沒有處理該異常,則操作系統會終止main執行。
- 拋出而未捕獲(未處理)異常的函數,必須用throws聲明其未處理的這些異常。有些異常是系統拋出的,程序只需要捕獲處理即可。
- 異常的捕獲順序:無論何時,throw以後的語句都不會執行;無論同層catch是否捕獲、處理本層的異常(即使拋出或轉發異常),同層的finally總是都會執行。 一個catch捕獲到異常後,同層catch都不會執行,然後執行同層finally; 一個同層try-catch-finally結束,若無異常則執行其後語句,若有異常,則跳過其後語句,進入上層catch流程。
上圖中紅色標出的為div的執行軌跡。
自定義異常類:
自定義異常類必須繼承Throwable或其子類;自定義異常類通常繼承Exception及其子類,因為它是程序可處理的類。自定義異常類會在父類的基礎上增加成員變量,因此,通常需要覆蓋toString函數(經常被打印)。未增加新成員就沒有必要自定義異常類。自定義異常類通常不必定義clone, equals:捕獲和處理異常時通常只是引用異常對象而已。
抽象類:
- Java可定義不含方法體的方法,其方法體由子類根據具體情況實現,這樣的方法稱為抽象方法,包括抽象方法的類必須是抽象類。抽象類和抽象方法的聲明必須加上abstract關鍵字。
- 類C如果滿足下面任一條件,則該類包含抽象方法且是抽象類:類C顯示地進行一個抽象方法的聲明;類C的父類中聲明的抽象方法未在類C和它的父類中實現;類C的接口中聲明一個方法,並且類C未實現該方法;只有類C有一個為實現的方法,類C就是抽象類。
- 抽象類不能被實例化,即不能用new關鍵字創建對象;抽象類可以定義構造函數,可以被子類調用;具體子類必須實現抽象父類中所有抽象方法,否則子類需要聲明為抽象類;抽象類只能用具體子類的對象實例化。
接口:
接口是公共靜態常量,公共靜態方法和公共抽象方法,默認實例方法的集合。接口中的一切都默認是public的,沒有修飾符的方法默認是abstract的,數據成員默認是static的。
接口不能定義構造函數,一個接口可繼承extends多個接口,接口不能被類extends,一個類可實現implements多個接口。
public interface I1{
public static final int k = 1;
public abstract void m();
}
1234
等價於:
public interface I1{
int k = 1; //=1不可省略,因為默認是public static final的,必須初始化
void m(); //不可定義函數體,默認是public abstract.
}
1234
接口中的方法通過“接口類型的引用變量.方法名”調用,但接口類型的引用變量必須引用實現了該接口的具體類的實例對象。接口中的常量名通過”接口名.常量名”訪問。
原創文章,作者:投稿專員,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/219118.html