基礎語法:
①java源文件名必須和public類名相同,一個java文件中只能有一個public類
②每個類都有構造方法。在創建一個對象的時候,至少要調用一個構造方法。構造方法的名稱必須與類同名。一個類可以有多個構造方法。
③接口和抽象類:java通過接口實現多重繼承,而一個類只能繼承一個類(包括抽象類)或者使用內部類可以實現多繼承。Java8中接口也可以有方法體。
變量類型:
①成員變量和類變量:類變量有static修飾符,修改類變量的值會令new出來的任何一個實例中具有相同的值,而不同實例對象間的成員變量相互獨立。
②局部變量沒有默認值,所以局部變量被聲明后,必須經過初始化,才可以使用。
基本數據類型:
① Java語言提供了八種基本類型。六種數字類型(四個整數型,兩個浮點型),一種字符類型,還有一種布爾型。
② 引用類型: 強引用 軟引用 弱引用 虛引用
引用類型的變量非常類似于C/C++的指針。引用類型指向一個對象(數組),指向對象的變量是引用變量。
③ 對于==,如果作用于基本數據類型的變量,則直接比較其存儲的“值”是否相等;如果作用于引用類型的變量(? 例如string類型),則比較的是所指向的對象的地址
④ 對于equals方法(注意:equals方法不能作用于基本數據類型的變量),如果沒有對equals方法進行重寫,則比較的是引用類型的變量所指向的對象的地址;諸如String、Date等類對equals方法進行了重寫的話,比較的是所指向的對象的內容。
修飾符:
① final(表示常量) 變量能被顯式地初始化并且只能初始化一次。被聲明為 final 的對象的引用不能指向不同的對象,但是 final對象里的數據可以被改變。
② 一個類不能同時被 abstract 和 final 修飾。如果一個類包含抽象方法,那么該類一定要聲明為抽象類,否則將出現編譯錯誤。
抽象方法不能被聲明成 final 和 static。
任何繼承抽象類的子類必須實現父類的所有抽象方法,除非該子類也是抽象類。
③ 靜態變量也被稱為類變量。局部變量不能被聲明為 static 變量。
④ synchronized 關鍵字聲明的方法同一時間只能被一個線程訪問。synchronized 修飾符可以應用于四個訪問修飾符。(保證原子性)
⑤ volatile 修飾的成員變量在每次被線程訪問時,都強制從公共內存中重新讀取該成員變量的值。而且,當成員變量發生變化時,會強制線程將變化值回寫到共享內存。這樣在任何時刻,兩個不同的線程總是看到某個成員變量的同一個值。(不保證原子性)
循環:
① do…while 循環和 while 循環相似,不同的是,do…while 循環至少會執行一次。
Number&Math類:
① Integer b = Integer.valueOf("444",16);? // 使用 16 進制
② 產生隨機數有兩種方法,一種是內置Random對象:? Random rand=new Random(); int j=rand.nextInt(100);
// 這里是一個方法的重載,參數的內容是指定范圍
一種是Math類的random方法:int i=(int)(Math.random()*100);
//生成0-100的隨機數
String類:
① String類是不可改變的解析,因此當對字符串進行修改的時候,需要使用StringBuffer和StringBuilder類。和String類不同的是,StringBuffer和 StringBuilder類的對象能夠被多次的修改,并且不產生新的未使用對象。
② StringBuilder類在Java 5中被提出,它和StringBuffer之間的最大不同在于StringBuilder的方法不是線程安全的(不能同步訪問)。
Collection接口類:
① Set 接口實例存儲的是無序的,不重復的數據。List 接口實例存儲的是有序的,可以重復的元素。
② Set檢索效率低下,刪除和插入效率高,插入和刪除不會引起元素位置改變 <實現類有HashSet,TreeSet>
③ List和數組類似,可以動態增長,根據實際存儲的數據的長度自動增長List的長度。查找元素效率高,插入刪除效率低,因為會引起其他元素位置改變 <實現類有ArrayList,LinkedList,Vector> 。
④ ArrayList只能通過get(int i)方法獲取索引 i 的值,不能通過x[i](數組的方法)方法獲取
Stream、File、IO:
PS:按照ANSI編碼標準,標點符號、數字、大小寫字母都占一個字節,漢字占2個字節。按照UNICODE標準所有字? ? 符都占2個字節。在Java當中字符是采用Unicode編碼標準的。
① File類創建文件
② FileInputStream\FileOutputStream負責從file對象讀取原始字節流
③ 如果要以指定的字符編碼方式(字符流)寫入或讀取文件,就需要InputStreamReader
④ 上面只能讀\寫一個字符,讀\寫多個字符需要BufferedReader
⑤ Scanner是一個可以使用正則表達式來分析基本類型和字符串的簡單文本掃描器
異常:
(1)如果調用者發現這個方法拋出異常,那么他必須
①捕獲處理這個異常(try...catch...finally...)
②拋出這個異常(使用 throws 關鍵字來聲明。throws 關鍵字放在方法簽名的尾部。)
(2)聲明自定義異常類
①如果希望寫一個檢查性異常類,則需要繼承 Exception 類。
②如果你想寫一個運行時異常類,那么需要繼承 RuntimeException 類。
③一個異常類和其它任何類一樣,包含有變量和方法。
繼承:
(1)子類的構造過程中必須調用父類的構造方法
(2)子類可在自己的構造方法中使用super()來調用父類的構造方法
①使用this來調用子類的另外的構造方法,調用的代碼只能出現在該構造方法內部的第一行可執行代碼,? ? ? 另外的構造方法必定使用super() ? ? ? ? ? ? ?調用父類構造方法
②如果調用super必須寫在子類構造方法的第一行
(3)如果子類的構造方法中沒有顯示的調用父類的構造方法,則系統默認的調用父類的無參的構造方法。
(4)如果子類的構造方法中既沒有顯示調用父類的構造方法,而父類中又沒有無參的構造方法,則編譯出錯。
(5)this用法:
①用于區分成員變量和局部變量同名的時候,在成員變量名前面帶上this.用于區分
②表示當前引用this的對象名。
③在一個類中如果構造函數間有重復,為增加程序的復用性,利用this調用重復的構造函數
重寫(Override)和重載(Overload):
① 方法的重寫(Overriding)和重載(Overloading)是java多態性的不同表現,重寫是父類與子類之間多態性的一種表現,重載是一類中多態性的一種表現。
② 重寫是在子類里面,方法名字相同,參數相同。返回類型相同。異常可以減少或刪除。訪問修飾符只可以降低限制。
③ 重載是在一個類里面,方法名字相同,而參數不同。返回類型可以相同也可以不同。異常可以修改。訪問修飾符可以修改。
④ 虛方法:編譯的時候檢查父類是否有該方法,而運行的時候則是調用特定對象(子類)的方法。要想調用父類中被重寫的方法,則必須使用關鍵字super。
抽象類:
① 抽象類不能被實例化。
② 抽象類中不一定包含抽象方法,但是有抽象方法的類必定是抽象類。
③ 構造方法、類方法(用static修飾的方法)不能聲明為抽象方法。
④ 抽象類的子類必須重寫抽象父類中的所有抽象方法,除非該子類也是抽象類。
接口:
① 接口不能用于實例化對象。
② 接口沒有構造方法。
③ 接口中所有的方法必須是抽象方法。
④ 接口中的變量會被隱式的指定為 public static/final 變量
⑤ 接口中不能含有靜態代碼塊以及靜態方法(用 static 修飾的方法)。
⑥ 接口允許多重繼承,但是要注意,繼承的多個接口可能包含相同名字方法,注意返回類型要一致,不然編譯報錯(原因:名字、參數相同,不符合重載規范)
Java多線程編程
① Java 線程的優先級是一個整數,其取值范圍是1(Thread.MIN_PRIORITY )- 10(Thread.MAX_PRIORITY )。? 具有較高優先級的線程對程序更重要,并且應該在低優先級的線程之前分配處理器資源。但是,線程優先級不能保證線程執行的順序,而且非常依賴于平臺。
② Thread.currentThread().getName()是獲得調用這個方法的線程的名字(用戶可通過setName()方法定義線程名字);this.getName()也是獲取當前線程對象的名字,但是必須在thread子類中調用,表示當前thread實例。如果沒有自定義線程名字,系統自動以線程編號命名(格式:Thread-X)。
例子:
③ Thread.join(),是用來指定當前主線程等待其他線程執行完畢后,再來繼續執行Thread.join()后面的代碼。
④ Thread.join(long millis),當前主線程等待該線程終止的時間最長為 millis 毫秒,超過時間沒完成則跳回? 主線程,執行join()后面的代碼。
匿名內部類
1、使用匿名內部類時,我們必須是繼承一個類或者實現一個接口,但是兩者不可兼得,同時也只能繼承一個類或者? 實現一個接口。
2、匿名內部類中是不能定義構造函數的。(初始化匿名內部類使用構造代碼塊)
3、匿名內部類中不能存在任何的靜態成員變量和靜態方法。
4、匿名內部類為局部內部類,所以局部內部類的所有限制同樣對匿名內部類生效。
5、匿名內部類不能是抽象的,它必須要實現繼承的類或者實現的接口的所有抽象方法