面向對象的程序設計有三大特征:
封裝:解決了數據的安全性問題
繼承:解決了代碼的重用問題
多態:解決了程序的擴展問題
1-類:具體相同特征或者行為的一種抽象。類是具有相同屬性和和行為的一組對象的集合。把相同的或相似的對象歸為一類的這個過程就是抽象。
還可以在定義類時為類添加訪問修飾符,對類進行訪問權限控制;
對類使用的訪問修飾符只有public和缺省兩種;
被public修飾的類可以從任何地方訪問,不受限制;
不加訪問修飾符,缺省修飾的類只能從本包中訪問,不同包則無法訪問到;
但要注意的是:在一個源文件中只能有一個被public修飾的類,並且文件名必須與public的類同名;
如果要定義多個public的類,則必須分別寫在不同的源文件中,一個源文件只寫一個類是良好的編程習慣。
2-構造函數:當此類型被new的時候會自動執行的一個方法。構造方法沒有返回值類型,也不能有返回值。
父類中的構造方法不能被子類繼承,即便它是public的;
父類的構造方法負責初始化屬於它的成員變量,而子類的構造方法則只需考慮屬於自己的成員變量,不必去關注父類的情況。
3-重載的三個原則:
1.方法名相同
2.參數不同(可以有三方面的不同)
數量不同
類型不同
順序不同
3.同一作用域
適當地重載構造方法,可以使初始化對象的方式更為靈活。
4-this
this引用總是指向調用成員方法的對象本身。
5-靜態變量
在成員變量前加static關鍵字,可以將其聲明為靜態成員變量。靜態變量和程序同生命周期;在沒有實例化對象時,可以通過類名訪問靜態成員變量;public class Ss { System.out.println(Ss.a);}。也可以通過對象訪問靜態成員變量,但不論使用的是哪個對象,訪
問到的都是同一個變量;靜態成員變量在聲明時最好初始化,如果不進行初始化,系統會默認初始化為0。如果類中成員變量被定義為靜態,那么不論有多少個對象,靜態成員變量只有一份內存拷貝,即所有對象共享該成員變量;靜態成員變量的作用域只在類內部,但其
生命周期卻貫穿整個程序;靜態成員方法只能對類的靜態成員變量進行操作;靜態成員方法沒有this引用。
6-繼承
繼承其實就是自動地共享基類中成員屬性和成員方法的機制。
繼承是能自動傳播代碼和重用代碼的有力工具;
繼承能夠在某些比較一般的類的基礎上建造、建立和擴充新類;
能減少代碼和數據的重復冗余度,並通過增強一致性來減少模塊間的接口和界面,從而增強了程序的可維護性;?????
能清晰地體現出類與類之間的層次結構關系。
繼承是單方向的,即派生類可以繼承和訪問基類中的成員,但基類則無法訪問派生類中的成員;
在Java中只允許單一繼承方式,即一個派生類只能繼承於一個基類,而不能象C++中派生類繼承於多個基類的多重繼承方式。
7-覆蓋、重寫
在類的繼承體系結構中,如果子類中出現了與父類中有同原型的方法,那么認為子類中的方法覆蓋了父類中的方法(也稱為方法重寫);
通過子類的實例調用被覆蓋的方法時,將總是調用子類中的方法,而父類中的方法將被隱藏。
8-多態
父類new不同的子類然后調用一個同名的方法,由於所有子類都要覆蓋此方法,所以方法的效果會有多種形態,此過程就是多態。
引用轉型:
使用父類直接new子類。
多態分為靜態多態和動態多態
靜態多態也稱為編譯時多態,即在編譯時決定調用哪個方法;
靜態多態一般是指方法重載;
只要構成了方法重載,就可以認為形成了靜態多態的條件;
靜態多態與是否發生繼承沒有必然聯系。
動態多態也稱為運行時多態,即在運行時才能確定調用哪個方法;
形成動態多態必須具體以下條件:
必須要有繼承的情況存在;
在繼承中必須要有方法覆蓋;
必須由基類的引用指向派生類的實例,並且通過基類的引用調用被覆蓋的方法;
由上述條件可以看出,繼承是實現動態多態的首要前提。
在有方法覆蓋的前提下,並且有引用轉型的情況,就將形成動態多態;
9-抽象方法、抽象類
如果某個類中包含有抽象方法,那么該類就必須定義成抽象類;
抽象類不可以直接實例化,只可以用來繼承;
抽象類的派生子類應該提供對其所有抽象方法的具體實現;
可以這么認為,抽象方法實際上就是由抽象基類強制要求其派生子類必須實現的方法原型;
如果抽象類的派生子類沒有實現其中的所有抽象方法,那么該派生子類仍然是抽象類,只能用於繼承,而不能實例化;
抽象類中也可以包含有非抽象的方法;
構造方法和靜態方法不可以修飾為abstract。
10-接口
與抽象類相似,接口同樣不可以實例化,只能用於實現;
接口中不能定義非抽象方法,也就是說接口中不能包含有函數實體;
接口中的所有方法都默認為抽象方法,無需在每個方法前加abstract關鍵字;
接口的實現類應該提供對接口中所有抽象方法的具體實現,否則將成為抽象類;
與抽象類和它的繼承類相似,也可以使用接口的引用指向其實現類的對象,從而達到動態多態的效果。
一個類只能繼承於一個父類,但可以實現多個接口。
11-異常
異常可分為兩大類:編譯時異常和運行時異常;
Throwable有兩個直接子類,它們是:
Error類:Error類的異常通常為內部錯誤,因此在正常情況下並不期望用戶程序捕獲它們;
Exception類:絕大部分用戶程序應當捕獲的異常類的根類;
一些常用的異常類都直接或間接派生自Exception類,因此我們可以認為絕大部分的異常都屬於Exception。
throw語句用於手工拋出異常;
執行流程將在throw語句后立即停止,轉而尋找與之類型相匹配的catch塊;
throw語句的語法是:
throw (new Exception("·····"));
如果某個函數中的代碼有可能引發異常,可以使用try/catch塊進行處理,這種處理方式成為“內部處理”;
如果不方便在函數內部進行處理,也可以將異常往函數外部傳遞,這就要使用到關鍵字throws;
throws用於將函數內部產生的異常拋給主調函數;
一般語法:
返回值類型 函數名(參數列表) throws 異常類型


final關鍵字:
1-修飾屬性:此變量不能被修改。
2-修飾方法:此方法不能被覆蓋。
3-修飾類:此類不能被繼承。
super關鍵字
在子類的構造方法中,super關鍵字可以顯式地調用父類的構造方法,用於將參數傳遞給它;
其一般語法是:
super(實際參數);
需要注意的是:該語句必須是子類構造方法的第一條語句。
如果父類和子類中有同名成員,在子類中默認訪問是屬於自己的那一個成員;
super關鍵字可以明確地指定要訪問父類中的成員;
其一般語法是:
super.成員名;
前提條件是:父類中的該成員不是private的。
所有重復性功能代碼都應該寫成一個方法。方便后期修改。
finally
無論try/catch塊中發生了什么,finally塊都一定會執行;
當異常發生時,程序可能會意外中斷,有些被占用的資源就得不到清理。finally塊可以確保執行所有的清理工作;
無論是否發生異常,finally塊都將執行;
finally塊是可選的,可視具體情況決定是否添加;
finally塊必須和try塊一起使用,不能單獨存在。
