------- android培訓、java培訓、期待與您交流! ----------
1、函數重載overload
同一個類中,函數名相同但是參數列表不同(參數個數或者參數類型),構成重載。
重載和函數的傳回值類型無關。
即:如果參數列表相同,僅僅傳回值類型不同,則不允許出現在同一個類中,編譯時間會出錯。
長度可變參數情況的重載
2、記憶體劃分:
heap 堆記憶體 :儲存new出來的東西,對象,數組,被初始化值
stack 棧記憶體 :儲存局部變數,引用;範圍和生命週期結束,記憶體自動釋放
datasegment :儲存字串常量和靜態變數
codesegment :儲存代碼
物件導向是一種思想,舉例 名詞提煉法
物件導向三個特張:封裝,繼承,多態
3、封裝(Encapsulation):隱藏對象的屬性和實現細節,僅對外提供公用訪問方式
好處:將變化隔離;便於使用;提高重用性;提高安全性
原則:將不需要對外提供的內容隱藏起來;把屬性隱藏,提供公用方法供外部存取。
public protected default private
同一類 ok ok ok ok
同一包 ok ok ok
子類 ok ok
不同包 ok
4、物件導向編程應考慮的問題:
1、有哪些類和對象
2、類和對象應有的屬性和方法
3、類與類、類與對象之間的關係(關聯、繼承、彙總、多態、實現)
聚集關係:has a 按照事物的緊密聯絡程度
組合:手、心臟
彙總:球隊、球員
繼承關係:父子關係
5、類 :
資料和對資料操作的集合,是對事物的描述;
包括:屬性(又叫成員變數)和成員方法
對象:類的執行個體,new出來的東西
5.1、成員變數和局部變數:
1、成員變數範圍整個類中; 局部變數範圍為函數體或者語句中。
2、成員變數存在於堆記憶體中; 局部變數存在於棧記憶體中。
3、成員變數隨對象的建立而建立,隨對象的消失而消失; 局部變數只在範圍記憶體在,範圍結束消失。
4、成員變數預設有初始化值; 局部變數需要手動初始化。
5.2、建構函式:
構建建立對象時調用的函數,作用是對對象進行初始化
和類名一樣,不能有傳回值類型,不能有return語句。
1、對象一建立就會調用與之對應的建構函式,用於對對象初始化
2、如沒有定義建構函式,系統內有預設的空參數的建構函式;當自訂建構函式後,預設建構函式消失;
3、建構函式和一般函數在寫法上和運行上有不同;
一個對象被建立時只調用一次建構函式;一般函數可被多次調用,並且只在需要時才調用;
建構函式內部可以調用一般函數。
4、建構函式可以有多個,用以對對象進行針對性的初始化,以重載的方式體現(參數列表不同);
5、建構函式前面如果加了void則成為一般函數。
6、建構函式可以被私人化,但如果被私人化就不可在外界建立對象時訪問該建構函式。
預設的無參建構函式,如果該類被public修飾,則該建構函式也是共有的。
javadoc的使用方法.
5.3、Java中的代碼塊
構造代碼塊:( 一個沒有名字的代碼塊 ) {。。。} 大括弧內即為構造代碼塊。
給對象進行初始化。
對象建立時運行,並且優先於建構函式運行。定義共性初始化內容。
構造代碼塊是給所有對象統一初始化,建構函式是給對應的對象初始化。
靜態代碼塊。 (static 修飾的無名代碼塊)
隨著類的載入而執行。而且只執行一次。 如果類中有主函數,優先於主函數執行。
靜態代碼塊只能訪問靜態成員。
作用:用於給類進行初始化。
先執行靜態代碼塊,先顯式初始化,使用建構函式時,先執行構造代碼塊,在執行建構函式。
靜態代碼塊給類初始化,構造代碼塊給對象初始化,建構函式給指定對象初始化。
分析 Person p = new Person();的執行過程
1、載入Person.class 檔案,進入codeSegment
2、載入靜態代碼塊
3、在堆記憶體中開闢空間,分配記憶體位址
4、在堆記憶體中建立對象的特有屬性,並進行預設初始化
5、對屬性進行顯示初始化(屬性的預設初始化賦值)
6、對對象進行構造代碼塊初始化
7、對對象進行對應的建構函式初始化
8、將記憶體位址賦給棧記憶體中的變數。
5.4、匿名對象:
new出來不起名字,則是匿名對象
匿名對象的使用方式:
1、當匿名對象的方法只調用一次,則可以用匿名對象。
2、匿名對象可以作為實際參數傳遞。
凡是簡化的必定有局限性:
比如:三目運算子是if else 語句的簡化,但是三目運算必須有運算值,並且語句只有一個。
匿名對象的方法只能被調用一次。
5.5、this關鍵字:
代表所在函數所屬對象的引用。super關鍵字是對父類的引用。
this應用:
區分局部變數和成員變數同名的情況。
當定義類中的功能時,函數內部要用到調用該函數的對象時,用this代表這個對象。
但凡本類功能內部使用到了本類對象,都用this表示。
建構函式之間有重複的內容或者功能,不能像一般函數一樣調用,需要使用this,this代表對象。
this語句用於建構函式之間互相調用。
this語句必須是建構函式的第一個語句,因為初始化動作要先執行,初始化動作中還有初始化動作時。
5.6、static 關鍵字:
成員變數和靜態變數的區別?
1,兩個變數的生命週期不同。
成員變數隨著對象的建立而存在,隨著對象的被回收而釋放。
靜態變數隨著類的載入而存在,隨著類的消失而消失。
2,調用方式不同。
成員變數只能被對象調用。
靜態變數可以被對象和類名調用。
3,別名不同。
成員變數也稱為執行個體變數。
靜態變數稱為類變數。
4,資料存放區位置不同。
成員變數資料存放區在堆記憶體的對象中,所以也叫對象的特有資料.
靜態變數資料存放區在方法區(共用資料區)的靜態區,所以也叫對象的共用資料.
靜態使用的注意事項:
1,靜態方法只能訪問靜態成員。(非靜態既可以訪問靜態,又可以訪問非靜態)
2,靜態方法中不可以使用this或者super關鍵字。靜態優先於對象而存在。
3,主函數是靜態。
靜態什麼時候用?
1,靜態變數。
當分析對象中所具備的成員變數的值都是相同的 。
這時這個成員就可以被靜態修飾。
只要資料在對象中都是不同的,就是對象的特有資料,必須儲存在對象中,是非靜態。
如果是相同的資料,對象不需要做修改,只需要使用即可,不需要儲存在對象中,定義成靜態。
2,靜態函數。
函數是否用靜態修飾,就參考一點,就是該函數功能是否有訪問到對象中的特有資料。
簡單點說,從原始碼看,該功能是否需要訪問非靜態成員變數,如果需要,該功能就是非靜態。
如果不需要,就可以將該功能定義成靜態。當然,也可以定義成非靜態,
但是非靜態需要被對象調用,而僅創
5.7、工具類:
沒有特有資料,都是靜態方法。
抽取一個應用程式中共有的功能,增強複用性,類中的方法都是靜態方法,封裝成一個工具類。
並且將無參建構函式私人化。因為該類建立對象沒有意義。
工具類靜態匯入 impport static
6、繼承:
java中的類只能單繼承,但可以多實現,支援多重繼承。
繼承體系,查閱父類功能,建立子類執行個體。
java中的介面可以多繼承。
實現介面的方法必須是public,因為介面的方法預設為public
6.1、覆蓋(重寫override):
當子父類中成員函數一模一樣,會運行子類的函數。
覆蓋注意事項:
1, 子類方法覆蓋父類方法時,子類許可權必須要大於等於父類的許可權。
2, 靜態只能覆蓋靜態,或被靜態覆蓋。
3、 子父類方法要一摸一樣
重載是同一個類中看參數列表是否相同。
覆蓋是子父類方法要一模一樣。
6.2、覆蓋原則:兩同兩小一大
兩同:函數名,參數列表相同
兩小:子類傳回值類型、子類拋出的異常要比父類小
一大:子類方法的存取權限比父類方法大
什麼時候使用覆蓋操作?
當對一個類進行子類的擴充時,子類需要保留父類的功能聲明,
但是要定義子類中該功能的特有內容時,就使用覆蓋操作完成.
1、子類在覆蓋父類方法時,父類的方法如果拋出了異常,
那麼子類的方法只能拋出父類的異常或者該異常的子類。
2、如果父類拋出多個異常,那麼子類只能拋出父類異常的子集。
子類覆蓋父類只能拋出父類的異常的子類或者子集。
注意:如果父類的方法沒有拋出異常,那麼子類覆蓋時絕對不能拋,就只能try .
super關鍵字,可以引用父類中的成員,在子類中訪問父類被隱藏的成員。
6.3、繼承中建構函式的用法:
子類中的建構函式預設調用父類無參建構函式,
父類建構函式必須在第一行,super();如果有this() 不能有super()
6.4、final關鍵字:
被final修飾的變數不能修改,作為常量大寫,多個單詞之間用 _ 隔開;
被final修飾的類不能被繼承,被final修飾的方法不能被重寫
abstract關鍵字:抽象類別和抽象方法。
7、多態:
事物可以存在多種形態,父類引用指向子類對象(父類和子類存在覆蓋或者實現)。
提高了擴充性,只能使用父類引用訪問父類中存在的成員。
父類引用指向子類對象後,子類被提升,向上轉型;
如果需要使用子類特有成員,需要向下轉型,對父類引用強制類型轉換。但不可將父類對象轉成子類。
7.1、多態時,成員的特點: 靜態繫結 動態綁定
Base base = new Sub();
靜態繫結:對於靜態成員,綁定到類上
動態綁定:非靜態成員,this引用指向不固定
1,當base調用成員變數。
編譯時間:先看Base類中的是否有調用的成員變數,有,編譯通過,沒有,編譯失敗。
運行時:先看Base類中的是否有調用的成員變數,並調用Base類中的成員變數。
簡單說:編譯和運行成員變數的值取決於等號的左邊。
2,成員函數(非靜態)。
編譯時間:先看Base類中的是否有調用的函數。有,編譯通過,沒有,編譯失敗。
運行時:運行子類中的函數。
簡單說:編譯看左邊,運行看右邊。
因為成員函數存在覆蓋特性。
3,靜態函數。
編譯時間:看Base類中的是否有調用的靜態方法。
運行時:運行Base中的靜態方法。
簡單說,編譯和運行都看左邊。
其實對於靜態方法,是不需要對象的。應該直接用類名調用,靜態繫結。
------- android培訓、java培訓、期待與您交流! ----------