本文是自己在復(fù)習(xí)Java的時候做的一些隨筆,有理解不對的地方歡迎各位大神指正...
一、基礎(chǔ)知識
1. Java概述
1. 1995,sun---2009,cracle收購---至今
2.分類:Java SE標準基礎(chǔ)、Java EE 網(wǎng)頁等JSP、Java ME 嵌入式開發(fā)
3.JVM:.java文件(源文件)---編譯器---.class文件(字節(jié)碼文件)---解釋器----輸出
4. JDK、JRE和JVM:JDK包含JRE,JRE包含JVM
5.環(huán)境變量配置:
Java_Home:JDK安裝路徑
Path:JDK命令文件位置
ClassPath:配置類庫的位置
6.跨平臺:根據(jù)不同平臺不同JVM解釋字節(jié)碼文件進行執(zhí)行。
7.垃圾回收:系統(tǒng)級線程自動檢查,釋放內(nèi)存
8.異常處理機制為魯棒性提供了支持
9.類中包含:屬性+方法;構(gòu)造方法;內(nèi)部類+塊(用得較少)
2.方法重載
一個類中多個方法名相同的叫方法重載。方法的參數(shù)不同,具體表現(xiàn)為:數(shù)量不同、類型不同、順序不同。
跟返回值沒關(guān)系:方法的返回類型可以相同也可以不相同,但僅僅返回類型不同不足以成為方法的重載。
將功能類似的方法進行重載。
說明:
參數(shù)列表不同包括:個數(shù)不同、類型不同和順序不同。
僅僅參數(shù)變量名稱不同是不可以的。
跟成員方法一樣,構(gòu)造方法也可以重載。
聲明為final的方法不能被重載。
聲明為static的方法不能被重載,但是能夠被再次聲明。
3.塊
分為:實例塊和靜態(tài)塊(static修飾)
實例塊:每次調(diào)用構(gòu)造方法前調(diào)用;
靜態(tài)塊:類加載的時候調(diào)用一次,僅一次,與是否創(chuàng)建對象無關(guān)。
4.字符串
String:replace()方法不會改變原來的串,而是生成新串。
StringBuffer:delete(1,4),包括1,但不包括4.涉及大量字符串操作時使用。線程安全
StringBuilder:線程不安全。
5.訪問修飾符
public 共有的,對所有類可見。
protected 受保護的,對同一包內(nèi)的類和所有子類可見,不能修飾類和接口,能被不同包的子類訪問。
private私有的,在同一類內(nèi)可見。類和接口不能聲明為private。
默認的在同一包內(nèi)可見。默認不使用任何修飾符。
6. 變量作用域
在Java中,變量的作用域分為四個級別:類級、對象實例級、方法級、塊級。
類級變量又稱全局級變量或靜態(tài)變量,需要使用static關(guān)鍵字修飾,類級變量在類定義后就已經(jīng)存在,占用內(nèi)存空間,可以通過類名來直接訪問,不需要實例化。
對象實例級變量就是成員變量,實例化后才會分配內(nèi)存空間,才能訪問。
方法級變量就是在方法內(nèi)部定義的變量,就是局部變量。
塊級變量就是定義在一個塊內(nèi)部的變量,變量的生存周期就是這個塊,出了這個塊就消失了,比如 if、for 語句的塊。塊是指由大括號包圍的代碼。
7.This關(guān)鍵字
this 關(guān)鍵字用來表示當(dāng)前對象本身,或當(dāng)前類的一個實例,通過 this 可以調(diào)用本對象的所有方法和屬性。
作為方法名初始化對象:調(diào)用本類的其他構(gòu)造方法(也就是構(gòu)造方法調(diào)用另一個構(gòu)造方法)
值得注意的是:
在構(gòu)造方法中調(diào)用另一個構(gòu)造方法,調(diào)用動作必須置于最起始的位置。
不能在構(gòu)造方法以外的任何方法內(nèi)調(diào)用構(gòu)造方法。
在一個構(gòu)造方法內(nèi)只能調(diào)用一個構(gòu)造方法。
8.Super關(guān)鍵字
super 關(guān)鍵字與this類似,this 用來表示當(dāng)前類的實例,super 用來表示父類。
super 可以用在子類中,通過點號(.)來獲取父類的成員變量和方法。super 也可以用在子類的子類中,Java 能自動向上層類追溯。
super 關(guān)鍵字的功能:
(1)調(diào)用父類中聲明為 private 的變量,但一定要在父類中聲明getter方法,否則不能調(diào)用private屬性變量。
(2)調(diào)用已經(jīng)覆蓋了的方法。
(3)作為方法名表示父類構(gòu)造方法。構(gòu)造方法不能被繼承,只能通過super調(diào)用。
注意:無論是 super() 還是 this(),都必須放在構(gòu)造方法的第一行。
最后注意 super 與 this 的區(qū)別:super 不是一個對象的引用,不能將 super 賦值給另一個對象變量,它只是一個指示編譯器調(diào)用父類方法的特殊關(guān)鍵字。
9.方法覆蓋
方法覆蓋的原則:
(1)覆蓋方法的返回類型、方法名稱、參數(shù)列表必須與原方法的相同。
(2)覆蓋方法不能比原方法訪問性差(即訪問權(quán)限不允許縮?。?/p>
(3)覆蓋方法不能比原方法拋出更多的異常。
(4)被覆蓋的方法不能是final類型,因為final修飾的方法是無法覆蓋的。
(5)被覆蓋的方法不能為private,否則在其子類中只是新定義了一個方法,并沒有對其進行覆蓋。
(6)被覆蓋的方法不能為static。如果父類中的方法為靜態(tài)的,而子類中的方法不是靜態(tài)的,但是兩個方法除了這一點外其他都滿足覆蓋條件,那么會發(fā)生編譯錯誤;反之亦然。即使父類和子類中的方法都是靜態(tài)的,并且滿足覆蓋條件,但是仍然不會發(fā)生覆蓋,因為靜態(tài)方法是在編譯的時候把靜態(tài)方法和類的引用類型進行匹配。
10.多態(tài)
多態(tài)轉(zhuǎn)型:
注意:不能直接將父類的對象強制轉(zhuǎn)換為子類類型,只能將向上轉(zhuǎn)型后的子類對象再次轉(zhuǎn)換為子類類型。也就是說,子類對象必須向上轉(zhuǎn)型后,才能再向下轉(zhuǎn)型。
總結(jié):對象的類型轉(zhuǎn)換在程序運行時檢查,向上轉(zhuǎn)型會自動進行,向下轉(zhuǎn)型的對象必須是當(dāng)前引用類型的子類。
向上轉(zhuǎn)型可以,向下轉(zhuǎn)型請注意!
11.Static
靜態(tài)變量和靜態(tài)方法能夠通過類名來訪問,不需要創(chuàng)建一個類的對象來訪問該類的靜態(tài)成員,所以static修飾的成員又稱作類變量和類方法。靜態(tài)變量與實例變量不同,實例變量總是通過對象來訪問,因為它們的值在對象和對象之間有所不同。
static的內(nèi)存分配:
靜態(tài)變量屬于類,不屬于任何獨立的對象,所以無需創(chuàng)建類的實例就可以訪問靜態(tài)變量。之所以會產(chǎn)生這樣的結(jié)果,是因為編譯器只為整個類創(chuàng)建了一個靜態(tài)變量的副本,也就是只分配一個內(nèi)存空間,雖然有多個實例,但這些實例共享該內(nèi)存。實例變量則不同,每創(chuàng)建一個對象,都會分配一次內(nèi)存空間,不同變量的內(nèi)存相互獨立,互不影響,改變 a 對象的實例變量不會影響 b 對象。
靜態(tài)方法:因為靜態(tài)方法不能操作對象,所以不能在靜態(tài)方法中訪問實例變量,只能訪問自身類的靜態(tài)變量。
一個類的靜態(tài)方法不能夠直接調(diào)用非靜態(tài)方法,所以在main方法中必修通過對象來調(diào)用非靜態(tài)方法。
12.final
在 Java 中,聲明類、變量和方法時,可使用關(guān)鍵字 final 來修飾。final 所修飾的數(shù)據(jù)具有“終態(tài)”的特征,表示“最終的”意思。
主要的作用就是阻止繼承和多態(tài)。
13.==和equals
基本數(shù)據(jù)類型,也被稱為原始數(shù)據(jù)類型,他們之間的比較,應(yīng)用雙等號(==),比較的是他們的值。
復(fù)合數(shù)據(jù)類型(類):當(dāng)他們用(==)進行比較的時候,比較的是他們在內(nèi)存中的存放地址,所以,除非是同一個new出來的對象,他們的比較后的結(jié)果為true,否則比較后結(jié)果為false。
JAVA當(dāng)中所有的類都是繼承于Object這個基類的,在Object中的基類中定義了一個equals的方法,這個方法的初始行為是比較對象的內(nèi)存地址,但在一些類庫當(dāng)中這個方法被覆蓋掉了,如String,Integer,Date在這些類當(dāng)中equals有其自身的實現(xiàn),而不再是比較類在堆內(nèi)存中的存放地址了。
14.內(nèi)部類
內(nèi)部類一般分為3類:成員式內(nèi)部類,局部內(nèi)部類,匿名內(nèi)部類。
15.抽象類
事實上,抽象類可以是一個完全正常實現(xiàn)的類,抽象類不一定包含抽象方法,但包含抽象方法的類必須是抽象類。
抽象類不能被實例化,抽象方法必須在子類中被實現(xiàn)。
16.接口
在抽象類中,可以包含一個或多個抽象方法;但在接口(interface)中,所有的方法必須都是抽象的,不能有方法體,它比抽象類更加“抽象”。
注意:接口中聲明的成員變量默認都是 public static final 的,必須顯示的初始化。因而在常量聲明時可以省略這些修飾符。
1) 接口中只能定義抽象方法,這些方法默認為 public abstract 的,因而在聲明方法時可以省略這些修飾符。試圖在接口中定義實例變量、非抽象的實例方法及靜態(tài)方法,都是非法的。
2) 接口中沒有構(gòu)造方法,不能被實例化。
3)一個接口不實現(xiàn)另一個接口,但可以繼承多個其他接口。接口的多繼承特點彌補了類的單繼承。
4)接口可以作為一個類型來使用。
5)Interface的意思是“所有”“實現(xiàn)”這個接口的類都應(yīng)該長成這個樣子,只要用到了這個interface都知道它有哪些方法可以調(diào)用。當(dāng)你implements一個interface的時候,你必須把這個interface的方法定義成public的,不這樣java編譯器就會報錯。
不同的類可以實現(xiàn)同一個接口,這是一種思想,也是邏輯分層的實現(xiàn)。
17.抽象類和接口
1) 抽象類可以為部分方法提供實現(xiàn),避免了在子類中重復(fù)實現(xiàn)這些方法,提高了代碼的可重用性,這是抽象類的優(yōu)勢;而接口中只能包含抽象方法,不能包含任何實現(xiàn)。
2) 一個類只能繼承一個直接的父類(可能是抽象類),但一個類可以實現(xiàn)多個接口,這個就是接口的優(yōu)勢。
原則:
行為模型應(yīng)該總是通過接口而不是抽象類定義,所以通常是優(yōu)先選用接口,盡量少用抽象類。
選擇抽象類的時候通常是如下情況:需要定義子類的行為,又要為子類提供通用的功能。
18.泛型
所謂“泛型”,就是“寬泛的數(shù)據(jù)類型”,任意的數(shù)據(jù)類型。
如果在使用泛型時沒有指名具體的數(shù)據(jù)類型,就會擦除泛型類型,并向上轉(zhuǎn)型為 Object,這與不使用泛型沒什么兩樣。
附:通配符(?)可以表示任意的數(shù)據(jù)類型。通配符(?)不但可以限制類型的上限,還可以限制下限。限制下限使用 super 關(guān)鍵字,例如 表示只能接受 Number 及其父類。
19.異常處理
注意在try塊中的對println( )的調(diào)用是永遠不會執(zhí)行的。一旦異常被引發(fā),程序控制由try塊轉(zhuǎn)到catch塊。執(zhí)行永遠不會從catch塊“返回”到try塊。
當(dāng)你用多catch語句時,記住異常子類必須在它們?nèi)魏胃割愔笆褂?。這是因為運用父類的catch語句將捕獲該類型及其所有子類類型的異常。如果子類在父類后面,子類將永遠不會到達。而且,Java中不能到達的代碼是一個錯誤。
如果一段程序中有異常發(fā)生或者拋出異常,要么catch,要么throws。
finally創(chuàng)建一個代碼塊。該代碼塊在一個try/catch 塊完成之后另一個try/catch出現(xiàn)之前執(zhí)行。finally塊無論有沒有異常拋出都會執(zhí)行。
注意:如果finally塊與一個try聯(lián)合使用,finally塊將在try結(jié)束之前執(zhí)行。
可以自己定義異常類來重載某些方法。
附:
(1)想要在Eclipse中輸入命令行參數(shù),可以在目錄中該程序上右鍵,選擇“Run As",選擇”Run configurations"
(2)Eclipse中如何開啟斷言(Assert),方法有二:
A. Run -> Run Configurations -> Arguments頁簽 -> VM arguments文本框中加上斷言開啟的標志:-enableassertions 或者-ea 就可以了
B.B在myEclipse中,Windows -> Preferences ->Java ->Installed JREs ->點擊正使用的JDK ->Edit ->Default VM Arguments文本框中輸入:-ea
20.多線程
(1)線程存在于好幾種狀態(tài)。線程可以正在運行(running)。只要獲得CPU時間它就可以運行。運行的線程可以被掛起(suspend),并臨時中斷它的執(zhí)行。一個掛起的線程可以被恢復(fù)(resume,允許它從停止的地方繼續(xù)運行。一個線程可以在等待資源時被阻塞(block)。在任何時候,線程可以終止(terminate),這立即中斷了它的運行。一旦終止,線程不能被恢復(fù)。
(2)管程(monitor)。管程是一種由C.A.R.Hoare首先定義的控制機制。你可以把管程想象成一個僅控制一個線程的小盒子。一旦線程進入管程,所有線程必須等待直到該線程退出了管程。用這種方法,管程可以用來防止共享的資源被多個線程操縱。
(3)當(dāng)Java程序啟動時,一個線程立刻運行,該線程通常叫做程序的主線程(main thread),因為它是程序開始時就執(zhí)行的。主線程的重要性體現(xiàn)在兩方面:
? ? 它是產(chǎn)生其他子線程的線程;
? ? 通常它必須最后完成執(zhí)行,因為它執(zhí)行各種關(guān)閉動作。
(4)大多數(shù)情況,通過實例化一個Thread對象來創(chuàng)建一個線程。Java定義了兩種方式:實現(xiàn)Runnable 接口+可以繼承Thread類。