一、 方法(函數) : 在java中,方法就是用來完成解決某件事情或實現某個功能的辦法。
方法的定義語法:
權限修飾符 返回值類型 方法名 (參數類型 參數名1 ... 參數類型 參數名n) {
方法體;
return 返回值;
}
二、 方法的遞歸調用指的是一個方法自己調用自己的形式。一般如果要進行方法的遞歸操作往往都具備有以下的特點:
方法必須有一個遞歸的結束條件;
方法在每次遞歸處理的時候一定要做出一些變更;
三、Java 中參數傳遞 :
傳值 : 方法調用時,實參把它的值傳遞給對應的形參,方法執行中形參值的改變不影響實參的值。
傳引用 : (傳址) 非八大基本類型,方法調用時,實參的引用(地址,而不是參數的值)被傳遞給方法中相對應的形參,在方法執行中,對形參的操作實際上就是對實參的操作,方法執行中形參值得改變將會影響實參的值。
四、面向對象(OO)和麪向過程的區別 :
同樣一個問題的解決過程,面向對象,是把這個過程看作是對象之間的相互作用關係;而面向過程,是把問題分成n個過程,然後按一定順序執行。
面向對象開發經過 OOA(面向對象分析)、OOD(面向對象設計)和 OOP(面向對象編程) 三個階段
面向對象(OO): 將功能封裝進對象,強調具備了功能的對象
類與對象的關係: 類是對象的抽象,對象是類的實例
類的成員包括: 屬性(變量)和行爲(方法)
用來描述對象的動態特徵(行爲)的一個動作序列是對象的方法而非屬性,類的方法描述了該類的對象的行爲
使用對象的屬性形式是: 對象.屬性名
使用對象的方法形式是: 對象.方法名()
面向對象的三大(四大)特徵: 封裝、繼承、多態(抽象)
面向對象的思維 :
作爲面向對象的思維來說,當考慮問題的時候,不應該再去考慮第一步幹嘛,第二步幹嘛,而應該首先考慮,作爲這個問題來說,在這個問題裏應該有
哪些類哪些對象,然後再考慮這些類和對象,每一種類和每一種對象,應該具有哪些屬性和方法,再考慮類與類之間具備了什麼樣的關係。
1. 面向對象封裝應遵循的原則 :
高內聚 :
內聚是指事務內部的聯繫緊密程度。在面向對象編程中,就是對象內各元素之間關係緊密程度。高內聚追求的是事物儘量只完成單一功能,以降低事物本身的複雜程度。
事物複雜度降低後,和其他事物的關係就會變得簡單。最終目的是避免牽一髮而動全身的情況。
低耦合 :
耦合是指事物之間的聯繫緊密程度。在面向對象編程中,就是對象與對象之間的關係緊密程度。低耦合追求的是事物儘量保持自身獨立,以達到牽一髮而動全身的情況。
2. 類與對象的關係 :
類是對象的抽象,而對象是類的具體事例。類是抽象的,不佔用內存,而對象是具體的,佔用存儲空間。
如何區分類和對象 :
對象可以看成是靜態屬性(成員變量) 和 動態屬性(方法函數)的封裝體。對象是new出來的,位於堆內存。
類是用來創建同一類型的對象的“模板”,在一個類中定義了該類對象所具有的成員變量及方法。類是靜態的慨念,放在代碼區。
3. static 靜態修飾符
① static 修飾的方法是靜態方法,靜態方法不能直接訪問非靜態方法,靜態方法可以直接訪問靜態方法和靜態屬性。靜態如果要調用非靜態,必須new 對象,才能調用。
② 非靜態方法任務時候都可以直接訪問靜態方法和靜態屬性。
③ 靜態的方法和屬性可以直接用類名.訪問。
④ static 方法和屬性內存只分配一次,在類裝載器中開闢內存。
⑤ static 修飾的變量是屬於類而不屬於對象。 靜態優於對象而存在
⑥ static 不能以任何形式去訪問this 和 super。
⑦ static 不能修飾類 , 不能修飾構造方法。
⑧ 如果想在第一時間加載某段代碼,可以使用靜態代碼塊。
4. 成員變量、局部變量、類變量 :
成員變量 : (全局變量、實例變量) 定義在類中,在整個類中都可以訪問。 存在於堆內存中。
成員變量隨着對象的建立而建立,存在於對象所在的堆內存中,成員變量有默認初始化值。
局部變量 : 局部變量只定義在局部範圍內。
局部變量存在於棧內存中,作用範圍結束,變量空間會自動釋放,局部變量沒有默認初始化值。
類變量 : 使用static 修飾,只開闢一次內存。伴隨類的存在而存在,生命週期最長。存在於方法區中。
5. 重載(overload) : 在同一個類中方法名相同,參數列表不同,與返回值及權限修飾符無關。
參數列表不同的情況 : ① 參數個數不同
② 參數個數相同,但類型不同
③ 參數個數和參數類型都相同,參數類型順序不同
6. 重寫(overide/overwrite) : 建立在繼承的基礎之上,子類與父類擁有相同的方法名、相同的參數列表、相同的返回值類型,並且子類權限大於父類權限。
爲何需要重寫? 當父類方法不能滿足子類的需求的時候,我們就需要重寫父類的方法。
兩同兩小一大原則 :
兩同 : ① 方法名相同
② 形參列表相同
兩小 : ① 子類方法返回值類型比父類方法返回值類型更小或相等
② 子類方法聲明拋出的異常類應比父類方法聲明拋出的異常類更小或相等
一大 : 子類方法的訪問權限應比父類方法的訪問權限更大或相等
7. 封裝 (private): 隱藏對象的屬性和實現細節,僅對外公開接口,控制在程序中屬性的讀取和修改的訪問級別。
將對象的屬性私有化,提供set、get方法供他人訪問使用。
好處 : ① 類內部的結構可以自由修改
② 可以對成員進行更精確的控制
③ 隱藏信息,實現細節
8. 繼承(extends) : 子類繼承父類除私有化修飾的屬性和方法。 繼承可以減少代碼的冗餘。
在Java中,只支持單一繼承,不支持多繼承。一個子類只能有一個直接父類,一個父類可以有一個或多個子類。
9. 構造方法(constructor) :
① 方法名與類名一樣。
② 構造方法無返回類型,並且在new 一個對象的時候,由JVM自動調用。
③ 構造方法同樣遵從方法重載的原則。
④ 在構造方法中調用另一個構造方法 ,this 語句必須放在第一行。
⑤ 如果程序在類中有非空構造方法,那麼JVM不會自動生成空的構造方法,否則會自動生成一個空構造方法。
⑥ 提前初始化類中的屬性和方法。
⑦ new 一個對象的時候,從這個對象開始到 Object ,默認是最子類查找空構造直到Object,途中如果有一個類缺少空構造,則編譯不通過。
查找是從最子類查找到最父類,執行是從最父類執行到最子類。
10. 多態(動態綁定 Polymorphism):
動態綁定 是指:在執行期間(而非編譯期間)判斷所引用對象的實際類型,根據其實際的類型調用其相應的方法。
new的哪個對象就調用那個對象重寫的父類的方法。
多態 是建立在繼承的基礎之上,因繼承機制允許,可以將某個對象看成其所屬類,也可以看成其超類,這樣就可以將多個對象看成同一個類,
當子類重寫父類的方法,由同一個對象調用,產生不同的行爲,這種現象就叫做多態!
多態存在的三個必要條件:① 要有繼承 ② 要有重寫 ③ 父類引用指向子類對象,三個條件滿足,當調用父類裏被重寫的方法時,實際中new的是哪個子類對象
就調用那個子類對象的方法。
非靜態: 父有 子有 調子類,父有 子無 調父類,父無 子有 編譯出錯
靜態(屬性): 父有 子有 調父類 ,父有 子無 調父類,父無 子有 編譯出錯
11. 抽象類(abstract):逆着關係由下向上(從子類到父類),類逐漸變得通用,變得抽象,越往上越通用越抽象,越往下越具體越實用。
① 用 abstract 修飾的類 叫做抽象類,用 abstract 修飾的方法 叫做抽象方法。
② 含有抽象方法的類必須被聲明爲抽象類,抽象類必須被繼承,抽象方法必須被重寫。
③ 抽象類不能被實例化。抽象類中的抽象方法要被使用,必須由子類重寫其所有的抽象方法,建立子類對象調用。
④ 抽象類中可以有抽象方法,也可以有變量、常量、普通方法、構造方法。
⑤ 抽象類可以被繼承,但子類要有兩種情況:① 重寫父類的抽象方法 ② 子類也使用 abstract 修飾
⑥ 抽象方法不能私有化(不能被 private 修飾),抽象方法不能被static 修飾,不能用final 修飾,抽象類也不能用final 修飾,不能與native、synchronized 同時使用。
注: 抽象類中可以有構造方法!!!!
在抽象類中可以有構造方法,只是不能直接創建抽象類的實例對象,但實例化子類的時候,就會初始化父類,不管父類是不是抽象類都會調用父類的構造方法,初始化一個類,先初始化父類。
使用抽象類是爲代碼的複用,而使用接口是爲了實現多態性。
12. 接口(interface):和類是同一種結構,接口中的方法都是抽象方法。
① 接口中不能有構造方法,不能有普通方法,可以有抽象方法。
② 接口中的方法可以加 abstract 修飾,也可以不加,默認是 public abstract 修飾的。
③ 接口中的抽象方法不能用 protected 和 private 修飾,可以用public修飾。。
④ 接口中可以有變量、常量、靜態常量,編譯後所有屬性都是靜態常量。 public static final 修飾
⑤ 接口可以用來彌補Java中類單一繼承的缺陷。
⑥ 類可以實現(implements)多個接口,實現接口後必須重寫所有的抽象方法。
⑦ 接口不能實例化,實現接口 使用 implements 關鍵字,語法: class 類名 implements 接口名
⑧ 類可以在繼承一個類同時實現多個接口,順序爲 先繼承再實現
類與類的關係是繼承關係: extends
類與接口的關係是實現關係:implements
接口與接口的關係是繼承關係:extends 接口之間存在多繼承。
爲什麼Java中不支持多繼承卻支持多實現?
答:因爲多繼承的方法,都存在方法體,當子類重寫父類的方法時,會使JVM綁定規則變得更復雜,
而多實現的方法,不存在方法體,可以由子類任意定義,只需重寫一次,故而不會增加JVM的綁定機制和複雜度。
接口與抽象類的區別:
答: 相同點:① 都是上層的抽象層
② 都不能實例化
③ 都可以包含抽象方法 ,這些抽象方法用於描敘具備的功能,但不必提供具體的實現
異同點:① Java抽象類可以提供某些方法的部分實現,而Java接口不可以
interface中只能定義方法,而不能有方法的實現,而在abstract class中則可以既有方法的具體實現,又有沒有具體實現的抽象方法
② 一個類只能繼承一個直接父類,這個父類可以是具體的類也可以是抽象類,但是一個類可以實現多個接口
13. final : 最終的
① 可以修飾類,但是不能被繼承
② 可以修飾方法,但是不能被重寫,只能被繼承
③ 可以修飾屬性,但屬性的值不能被改變,是一個常量,可以修飾參數,參數值也不能改變
④ 不能修飾構造方法