Java學習筆記(長期更新)
初識Java
20200824
初識
- Java 是由Sun Microsystems公司於1995年5月推出的高階程式設計語言。
- Java可運行於多個平臺,如Windows, Mac OS,及其他多種UNIX版本的系統。
簡介
- Java分為三個體系:
- JavaSE(J2SE)(Java2 Platform Standard Edition,java平臺標準版)
- JavaEE(J2EE)(Java 2 Platform,Enterprise Edition,java平臺企業版)
- JavaME(J2ME)(Java 2 Platform Micro Edition,java平臺微型版)。
- 2005年6月,JavaOne大會召開,SUN公司公開Java SE 6。此時,Java的各種版本已經更名以取消其中的數字"2":J2EE更名為Java EE, J2SE更名為Java SE,J2ME更名為Java ME。
主要特性
-
Java語言是簡單的:
Java語言的語法與C語言和C++語言很接近,使得大多數程式設計師很容易學習和使用。另一方面,Java丟棄了C++中很少使用的、很難理解的、令人迷惑的那些特性,如操作符過載、多繼承、自動的強制型別轉換。特別地,Java語言不使用指標,而是引用。並提供了自動的廢料收集,使得程式設計師不必為記憶體管理而擔憂。
-
Java語言是面向物件的:
Java語言提供類、介面和繼承等面向物件的特性,為了簡單起見,只支援類之間的單繼承,但支援介面之間的多繼承,並支援類與介面之間的實現機制(關鍵字為implements)。Java語言全面支援動態繫結,而C++語言只對虛擬函式使用動態繫結。總之,Java語言是一個純的面向物件程式設計語言。
-
Java語言是分散式的:
Java語言支援Internet應用的開發,在基本的Java應用程式設計介面中有一個網路應用程式設計介面(java net),它提供了用於網路應用程式設計的類庫,包括URL、URLConnection、Socket、ServerSocket等。Java的RMI(遠端方法啟用)機制也是開發分散式應用的重要手段。
-
Java語言是健壯的:
Java的強型別機制、異常處理、垃圾的自動收集等是Java程式健壯性的重要保證。對指標的丟棄是Java的明智選擇。Java的安全檢查機制使得Java更具健壯性。
-
Java語言是安全的:
Java通常被用在網路環境中,為此,Java提供了一個安全機制以防惡意程式碼的攻擊。除了Java語言具有的許多安全特性以外,Java對通過網路下載的類具有一個安全防範機制(類ClassLoader),如分配不同的名字空間以防替代本地的同名類、位元組程式碼檢查,並提供安全管理機制(類SecurityManager)讓Java應用設定安全哨兵。
-
Java語言是體系結構中立的:
Java程式(字尾為java的檔案)在Java平臺上被編譯為體系結構中立的位元組碼格式(字尾為class的檔案),然後可以在實現這個Java平臺的任何系統中執行。這種途徑適合於異構的網路環境和軟體的分發。
-
Java語言是可移植的:
這種可移植性來源於體系結構中立性,另外,Java還嚴格規定了各個基本資料型別的長度。Java系統本身也具有很強的可移植性,Java編譯器是用Java實現的,Java的執行環境是用ANSI C實現的。
-
Java語言是解釋型的:
如前所述,Java程式在Java平臺上被編譯為位元組碼格式,然後可以在實現這個Java平臺的任何系統中執行。在執行時,Java平臺中的Java直譯器對這些位元組碼進行解釋執行,執行過程中需要的類在聯接階段被載入到執行環境中。
-
Java是高效能的:
與那些解釋型的高階指令碼語言相比,Java的確是高效能的。事實上,Java的執行速度隨著JIT(Just-In-Time)編譯器技術的發展越來越接近於C++。
-
Java語言是多執行緒的:
在Java語言中,執行緒是一種特殊的物件,它必須由Thread類或其子(孫)類來建立。通常有兩種方法來建立執行緒:其一,使用型構為Thread(Runnable)的構造子類將一個實現了Runnable介面的物件包裝成一個執行緒,其二,從Thread類派生出子類並重寫run方法,使用該子類建立的物件即為執行緒。值得注意的是Thread類已經實現了Runnable介面,因此,任何一個執行緒均有它的run方法,而run方法中包含了執行緒所要執行的程式碼。執行緒的活動由一組方法來控制。Java語言支援多個執行緒的同時執行,並提供多執行緒之間的同步機制(關鍵字為synchronized)。
-
Java語言是動態的:
Java語言的設計目標之一是適應於動態變化的環境。Java程式需要的類能夠動態地被載入到執行環境,也可以通過網路來載入所需要的類。這也有利於軟體的升級。另外,Java中的類有一個執行時刻的表示,能進行執行時刻的型別檢查。
發展歷史
- 1995年5月23日,Java語言誕生
- 1996年1月,第一個JDK-JDK1.0誕生
- 1996年4月,10個最主要的作業系統供應商申明將在其產品中嵌入JAVA技術
- 1996年9月,約8.3萬個網頁應用了JAVA技術來製作
- 1997年2月18日,JDK1.1釋出
- 1997年4月2日,JavaOne會議召開,參與者逾一萬人,創當時全球同類會議規模之紀錄
- 1997年9月,JavaDeveloperConnection社群成員超過十萬
- 1998年2月,JDK1.1被下載超過2,000,000次
- 1998年12月8日,JAVA2企業平臺J2EE釋出
- 1999年6月,SUN公司釋出Java的三個版本:標準版(JavaSE,以前是J2SE)、企業版(JavaEE以前是J2EE)和微型版(JavaME,以前是J2ME)
- 2000年5月8日,JDK1.3釋出
- 2000年5月29日,JDK1.4釋出
- 2001年6月5日,NOKIA宣佈,到2003年將出售1億部支援Java的手機
- 2001年9月24日,J2EE1.3釋出
- 2002年2月26日,J2SE1.4釋出,自此Java的計算能力有了大幅提升
- 2004年9月30日18:00PM,J2SE1.5釋出,成為Java語言發展史上的又一里程碑。為了表示該版本的重要性,J2SE1.5更名為Java SE 5.0
- 2005年6月,JavaOne大會召開,SUN公司公開Java SE 6。此時,Java的各種版本已經更名,以取消其中的數字"2":J2EE更名為Java EE,J2SE更名為Java SE,J2ME更名為Java ME
- 2006年12月,SUN公司釋出JRE6.0
- 2009年04月20日,甲骨文74億美元收購Sun。取得java的版權。
- 2010年11月,由於甲骨文對於Java社群的不友善,因此Apache揚言將退出JCP[4]。
- 2011年7月28日,甲骨文釋出 Java7.0 的正式版。
- 2014年3月18日,Oracle公司發表 Java SE 8。
- 2017年9月21日,Oracle公司發表 Java SE 9
- 2018年3月21日,Oracle公司發表 Java SE 10
- 2018年9月25日,Java SE 11 釋出
- 2019年3月20日,Java SE 12 釋出
Java關鍵字
類別 | 關鍵字 | 說明 |
---|---|---|
訪問控制 | private | 私有的 |
protected | 受保護的 | |
public | 公共的 | |
default | 預設 | |
類、方法和變數修飾符 | abstract | 宣告抽象 |
class | 類 | |
extends | 擴充,繼承 | |
final | 最終值,不可改變的 | |
implements | 實現(介面) | |
interface | 介面 | |
native | 本地,原生方法(非 Java 實現) | |
new | 新,建立 | |
static | 靜態 | |
strictfp | 嚴格,精準 | |
synchronized | 執行緒,同步 | |
transient | 短暫 | |
volatile | 易失 | |
程式控制語句 | break | 跳出迴圈 |
case | 定義一個值以供 switch 選擇 | |
continue | 繼續 | |
default | 預設 | |
do | 執行 | |
else | 否則 | |
for | 迴圈 | |
if | 如果 | |
instanceof | 例項 | |
return | 返回 | |
switch | 根據值選擇執行 | |
while | 迴圈 | |
錯誤處理 | assert | 斷言表示式是否為真 |
catch | 捕捉異常 | |
finally | 有沒有異常都執行 | |
throw | 丟擲一個異常物件 | |
throws | 宣告一個異常可能被丟擲 | |
try | 捕獲異常 | |
包相關 | import | 引入 |
package | 包 | |
基本型別 | boolean | 布林型 |
byte | 位元組型 | |
char | 字元型 | |
double | 雙精度浮點 | |
float | 單精度浮點 | |
int | 整型 | |
long | 長整型 | |
short | 短整型 | |
變數引用 | super | 父類,超類 |
this | 本類 | |
void | 無返回值 | |
保留關鍵字 | goto | 是關鍵字,但不能使用 |
const | 是關鍵字,但不能使用 | |
null | 空 |
核心基礎
註釋
-
單行註釋
//
-
多行註釋(不可以巢狀使用)
/**/
-
java特有的文件註釋
/** @author ··· @version ··· @··· */
- 註釋的內容可以被JDK提供的工具Javadoc所解析,生成一套一網頁形式的體現該程式說明的文件
javadoc -d 資料夾名 -author -version 原始檔名
Tip:關鍵字public
必須加在同名檔案的類名前,且一個檔案中有且僅有一個public關鍵字宣告的類
Tip:程式的入口是mian
方法,格式是固定的public static void main(String[] arguements)
-
示例程式碼
public class test{ public static void main(String[] args){ System.out.println("Hello Java"); // print() 方法也是輸出但是不會在結尾新增換行符 } }
Tip:語句結束符;
Tip:在java檔案中每宣告一個類在編譯完成後都會生成一個對應的.class
位元組碼檔案
編寫注意事項
- 大小寫敏感:Java 是大小寫敏感的,這就意味著識別符號 Hello 與 hello 是不同的。
- 類名:對於所有的類來說,類名的首字母應該大寫。如果類名由若干單片語成,那麼每個單詞的首字母應該大寫,例如 MyFirstJavaClass 。
- 方法名:所有的方法名都應該以小寫字母開頭。如果方法名含有若干單詞,則後面的每個單詞首字母大寫。
- 原始檔名:原始檔名必須和類名相同。當儲存檔案的時候,你應該使用類名作為檔名儲存(切記 Java 是大小寫敏感的),檔名的字尾為 .java。(如果檔名和類名不相同則會導致編譯錯誤)。
- 主方法入口:所有的 Java 程式由 public static void main(String[] args) 方法開始執行。
識別符號
- 所有的識別符號都應該以字母(A-Z 或者 a-z),美元符($)、或者下劃線(_)開始
- 首字元之後可以是字母(A-Z 或者 a-z),美元符($)、下劃線(_)或數字的任何字元組合
- 關鍵字不能用作識別符號
- 識別符號是大小寫敏感的
- 合法識別符號舉例:age、$salary、_value、__1_value
- 非法識別符號舉例:123abc、-salary
修飾符
- 訪問控制修飾符 : default, public , protected, private
- 非訪問控制修飾符 : final, abstract, static, synchronized
命名規範
- 包名:多單片語成時所有所有字母小寫
- 類名、介面名:大駝峰命名法
- 變數名、方法名:小駝峰命名法
- 常量名:所有的字母大寫,多個單詞使用下劃線連線
- 所有命名都應遵循見名知意
Tip:java使用的是Unicode字符集,因此識別符號可以使用漢字,但是不建議使用!
變數
- 類變數:獨立於方法之外的變數,用 static 修飾。
- 類變數也稱為靜態變數,在類中以 static 關鍵字宣告,但必須在方法之外。
- 無論一個類建立了多少個物件,類只擁有類變數的一份拷貝。
- 靜態變數除了被宣告為常量外很少使用。常量是指宣告為public/private,final和static型別的變數。常量初始化後不可改變。
- 靜態變數儲存在靜態儲存區。經常被宣告為常量,很少單獨使用static宣告變數。
- 靜態變數在第一次被訪問時建立,在程式結束時銷燬。
- 與例項變數具有相似的可見性。但為了對類的使用者可見,大多數靜態變數宣告為public型別。
- 預設值和例項變數相似。數值型變數預設值是0,布林型預設值是false,引用型別預設值是null。變數的值可以在宣告的時候指定,也可以在構造方法中指定。此外,靜態變數還可以在靜態語句塊中初始化。
- 靜態變數可以通過:ClassName.VariableName的方式訪問。
- 類變數被宣告為public static final型別時,類變數名稱一般建議使用大寫字母。如果靜態變數不是public和final型別,其命名方式與例項變數以及區域性變數的命名方式一致。
- 例項變數:獨立於方法之外的變數,不過沒有 static 修飾。
- 例項變數宣告在一個類中,但在方法、構造方法和語句塊之外;
- 當一個物件被例項化之後,每個例項變數的值就跟著確定;
- 例項變數在物件建立的時候建立,在物件被銷燬的時候銷燬;
- 例項變數的值應該至少被一個方法、構造方法或者語句塊引用,使得外部能夠通過這些方式獲取例項變數資訊;
- 例項變數可以宣告在使用前或者使用後;
- 訪問修飾符可以修飾例項變數;
- 例項變數對於類中的方法、構造方法或者語句塊是可見的。一般情況下應該把例項變數設為私有。通過使用訪問修飾符可以使例項變數對子類可見;
- 例項變數具有預設值。數值型變數的預設值是0,布林型變數的預設值是false,引用型別變數的預設值是null。變數的值可以在宣告時指定,也可以在構造方法中指定;
- 例項變數可以直接通過變數名訪問。但在靜態方法以及其他類中,就應該使用完全限定名:ObejectReference.VariableName。
- 區域性變數:類的方法中的變數。
- 區域性變數宣告在方法、構造方法或者語句塊中;
- 區域性變數在方法、構造方法、或者語句塊被執行的時候建立,當它們執行完成後,變數將會被銷燬;
- 訪問修飾符不能用於區域性變數;
- 區域性變數只在宣告它的方法、構造方法或者語句塊中可見;
- 區域性變數是在棧上分配的。
- 區域性變數沒有預設值,所以區域性變數被聲明後,必須經過初始化,才可以使用。
變數的分類(資料型別)
- 資料型別
- 基本資料型別
- 數值型
- 整數型別(byte,short,int,long)
- 浮點型別(float,double)
- 字元型(char)
- 布林型(boolean)
- 數值型
- 引用資料型別
- 類(class)
- 介面(interface)
- 陣列(array)
- 基本資料型別