面向對象:世間萬物皆對象:
特性:封裝 繼承 多態
Java回收機制回收的是堆中的垃圾
類:
概念:
對一類事物的描述,引用類型,數據在堆中存儲
靜態性的特徵描述:字段
動態性的行爲描述:方法
對象(實例):
客觀世界中真實存在的,某一類事物的某一個個體
對象的屬性分配在堆內存中,但是對象名分配在棧內存中
一個類中的成員:
1)字段(屬性,成員變量,全局變量):
聲明:
[訪問修飾符] 數據類型 變量名[=初始值];
局部變量:
在方法內部/方法中的參數或代碼塊中聲明,必須有初始值,生命週期與方法調用有關
字段:
在方法外面,類的內部進行聲明,可以沒有初始值,生命週期與對象有關
默認初始化:
整數型:0
浮點型:0.0
字符型:\u0000
布爾型:false
引用類型:null
顯式初始化:
2)方法:
[訪問修飾符] 返回值 方法名([參數列表]) {方法體}
返回值:
無:void
有:需要些返回值類型,必須由return語句
return:必須保證每個條件分支都有return
return語句必須是可執行代碼的最後一句
參數列表:
實參=形參;
參數傳遞:
方式:
值傳遞,Java只有值傳遞
傳值(傳值類型的參數):
把實參的值賦值給形參,實參不隨着形參的變化而變化
傳引用(傳引用類型的參數):
把實參的值(引用類型的地址)賦值給形參,實參有可能隨着形參的變化而變化(重新new一個就不會變)
遞歸:自己調用自己
條件:
1)要有返回值
2)必須有臨界條件
斐波那契數列,漢諾塔
3)構造器(構造方法):構造對象,沒有構造器產生不了對象
如果該類沒有寫構造器,系統默認提供一個公開的無參的構造器
如果該類顯式編寫了構造器,系統將不再提供默認的構造器
特徵:
1)與類同名
2)沒有返回值,也沒有void
3)不能在方法中使用return
聲明:
[訪問修飾符] 類名([參數列表]) {初始化成員變量}
4)內部類:內部類就是定義在另一個類的內部的類
好處:
1)對外可以隱藏外部類的細節
2)對於內部類來說,外部類的所有成員均有訪問權限
3)內部類可以模擬實現多繼承(接口和內部類)
4)接口和父類中某個方法同名,通過內部類解決
分類:
1)成員內部類:
1-1)實例內部類:
1)定義在方法外部,沒有static修飾的內部類稱爲實例內部類
2)在外部類中可以直接創建內部類對象
3)如果在其他類中創建內部類對象,必須先創建外部類的對象實例,然後在外部類實例的基礎上創建內部類對象實例
外部類.內部類 變量名=外部類對象實例.new 內部類();
4)內部類可以直接訪問外部類所有的成員,外部類如果想要訪問內部類的成員,必須創建內部類的對象實例,通過實例訪問
5)在內部類中不能定義靜態成員,只能定義實例成員
6)如果內部類中的成員或者局部變量和外部類成員同名:
外部類名.this.成員名 表示外部類的成員
this.成員名 表示內部類的成員
1-2)靜態內部類:
1)在方法外部用static修飾的內部類稱爲靜態內部類
2)靜態內部類可以直接訪問外部類中的靜態成員,如果需要訪問實例成員,則需要通過實例訪問
3)在其他類中創建內部類對象,可以直接new創建,不必通過外部類對象實例
外部類.內部類 變量名=new 外部類.內部類();
4)在靜態內部類中,可以定義靜態成員和非靜態成員
5)在其他類中可以通過完整的類名訪問內部類的靜態成員 外部類.內部類.靜態成員
2)局部類:
2-1)局部內部類:
1)在一個方法內部定義的內部類稱爲局部內部類
2)局部內部類只在方法內部可見,方法外部無法使用
3)局部內部類類似於局部變量,不能使用private/protected/public/static修飾
4)局部內部類中不能包含靜態成員
5)局部內部類可以直接訪問所有的外部類成員和方法內final類型的參數和變量
2-2)匿名內部類:
1)匿名類是一種沒有名字的特殊內部類
2)可以定義在方法的內部,也可以定義在方法的外部
3)匿名類本身沒有構造器,但是可以調用父類的構造方法
4)沒有訪問修飾符
5)父類或者父接口 變量名=new 父類或者父接口(){匿名類的成員}
6)A a = new A(){}
如果A是一個類或者抽象類,則相當於定義並創建了A類的子類的實例並賦值給A類型的變量(a是一個多態對象)
如果A是一個接口,則相當於定義並創建了一個實現A接口的類的實例並賦值給A類型的變量
7)lambda表達式:jdk1.8之後出現,只能是接口的
作用:
1)當做是一個匿名方法使用
2)允許我們將行爲傳遞到函數裏
語法:
(參數)->{//方法體}
垃圾回收機制:
對象會被回收情況:
1)對象的引用被置爲null
2)使用的匿名對象
3)超出生命週期
封裝:
步驟:
1)將字段私有(private)
2)公開getXxxxw()或者setXxxx()方法訪問該字段
this:這個,代詞,誰調用就指誰
區分成員變量和局部變量的,在成員變量前加this
好處:
1)隱藏類中的細節
2)方便修改的實現
3)只能通過規定的方法訪問
繼承:單繼承 一般類與特殊類之間的關係 耦合度最高
子類的成員:
1)繼承父類的可視化(非私有)的成員(字段/方法),構造器不能被繼承
2)子類所特有的成員(字段/方法/構造器)
3)重載父類的成員(方法) ---編譯時多態(多態的一種)
3-1)重載的條件:
3-1-1):發生在統一個類或者父子類之間
3-1-2):方法名稱相同,參數列表不同(數據類型/參數個數/參數順序),作爲判斷重載的條件
3-1-3):返回值無所謂,可以相同也可以不同,不能作爲判斷重載的條件
3-1-4):訪問權限無所謂
3-2)重載的本質:
兩個毫不相關的方法
3-3)重載的調用:
避免歧義重載,否則編譯錯誤
3-4)構造器重載:
3-4-1):this的2種用法: 指向本類的引用
a)this.成員:調用本類的方法和字段,誰調用指的是誰
b)this([參數列表]):調用本類其他的構造方法,根據參數列表來進行匹配,這句話必須在構造方法的第一句
4)覆蓋[重寫]父類的成員(方法): 運行時多態
4-1)覆蓋的條件:
4-1-1):發生在父子類之間(繼承關係中)
4-1-2):方法名稱相同,參數列表相同(參數的數據類型/參數的個數/參數的順序)
4-1-3):返回值類型必須相同
4-1-4):子類覆蓋方法的訪問權限必須大於父類被覆蓋方法的訪問權限
4-1-5):子類不能拋出比父類異常類更大的異常(運行時異常例外)
4-2)覆蓋的本質:
替換
4-3)super:指向父類的引用
4-3-1)super.成員:調用父類的方法/字段
4-3-2)super([參數列表]):super中的參數決定調用父類的哪一個構造器
4-3-3)系統默認調用super();:調用父類中無參的構造器;如果父類沒有無參的構造器,則需要在子類的構造器中顯示調用super(參數列表)或者this(參數列表),否則報編譯錯誤
4-3-4)super();只能出現在子類的構造器中,且必須是第一行
PS:this和super不能在同一個構造器中同時出現
5)隱藏父類的成員(字段/靜態方法):
子類中定義了一個與父類中相同的字段(普通字段即可),那麼父類中的字段會被隱藏,普通方法不會隱藏,只會覆蓋,只有靜態方法會被隱藏,隱藏不會發生動態綁定
多態對象:向上造型
父類的對象指向子類的實例,該對象叫多態對象
父類 對象名(多態對象) = new 子類();
動態綁定:
父類 對象名(多態對象) = new 子類();
父接口 對象名(多態對象) = new 實現類();
編譯時對象是父類的類型,運行時是子類的類型,所以是動態綁定,該對象不能直接調用子類所特有的成員
多態對象:
1)調用覆蓋的方法調用的是子類的;
2)調用隱藏的成員,調用的是父類的
多態存在的三個必要條件:
1)要有繼承或實現
2)要有重寫
3)父類引用指向子類對象
多態的優點:
1)簡化代碼
2)改善代碼的組織性和可讀性
3)易於擴展
多態的應用:
方法的參數或者返回值使用父類的類型,數組中的元素是子類的類型
Animal[] array = new Animal[3];
array[0] = new Cat();
array[1] = new Dog();
繼承的好處:
1)代碼重用,減少了代碼的冗餘
2)使編碼更高效
3)易維護
繼承的缺點:
1)耦合度比較高
繼承的聲明方式:
[訪問修飾符] class 子類 extends 父類 {成員}
子類:派生類/孩兒類
父類:原生類/超類/基類
繼承的規則:
1)Java中只支持單繼承,也就是說每個類只能有一個父類,不允許有多重繼承
2)一個父類可以有多個子類
3)子類繼承父類所有的屬性和方法
子類繼承父類,擁有父類的所有屬性和方法,但是對於父類私有的(private),子類沒有使用權,只有擁有權
繼承子類實例化過程:
1)子類實例化時先實例化其父類,然後實例化子類
2)要先調用父類的構造器,父類構造器運行完畢,才調用子類的構造器
格式良好的Java文件:
[包聲明語句]; package 包名;
[導包語句]*; import 包名;
類聲明語句; class public類只能有一個
包(package): 全部小寫(Internet的倒敘) .
功能:
1)有助於避免類名衝突問題
2)包允許將類組合成較小的單元
3)包允許在更廣的範圍內保護類/數據和方法
import:
1)java.lang.*:默認包,默認自動導入;
2)java.io.*:輸入輸出流;
1)使用通配符*,是把當下包的所有的類都加載到內存,消耗內存
2)導包時只能看到導入包下的類以及其子包,不能訪問子包下的類
類之間的關係:
1)泛化(is-a):繼承.
2)實現:
3)組合(has-a):一個類作爲另一個類的成員變量
3-1)合成:個體和整體的關係,生命週期相同
3-2)聚合:個體和整體的關係,生命週期不同
3-3)關聯:
4)依賴(use-a):一個類作爲另一個類的方法的參數或者返回值
造型(引用數據類型(父子類)的轉換):
1)向上造型:自動轉換 小(子類)-->大(父類)
2)向下造型:強制轉換 大(父類)-->小(子類)
如果能夠下轉型的對象必須經過上轉型,即多態對象.
變量 instanceof 類[接口] 判斷變量所指向的實例是否是類[接口]的實例
訪問權限:
private < default(friendly) < protected < public
有兩個訪問權限與包有關:default protected
1)private:只能本類訪問
2)default:只能同一個包中訪問
3)protected:同一個包中的類或者不同包的子類中可以訪問
4)public:不論是不是同一個包的類都可以訪問
關鍵字:
1)static:靜態的,類的,與對象無關 不能修飾局部變量
1)字段(成員變量=實例變量):類變量/靜態變量
特點:
所有的對象共享
2)方法:類方法/靜態方法,不需要實例化,可以直接訪問
2-1)靜態方法可以直接訪問靜態成員,不能直接訪問非靜態的成員,如果需要訪問,則需要創建實例對象間接訪問
2-2)非靜態方法可以直接靜態成員和非靜態成員
2-3)靜態方法中不能有this和super關鍵字
3)塊:靜態代碼塊/靜態塊
語法:
static{}
特點:
1)類一加載就執行,只執行一次,比構造器先執行,一個類中可以有多個,按照書寫順序執行
2)非靜態代碼塊(實例代碼塊)也比構造器先執行,創建一個對象就執行一次,可以有多個,按照書寫順序執行
初始化:
1)實例變量初始化:聲明時/構造器
2)靜態變量初始化:聲明時/靜態代碼塊
4)內部類:
2)final:終態的
1)變量:常量,不能第二次賦值,必須要有初始值,聲明時或者構造器中賦值
2)方法:不能被重寫
3)類:不能被繼承
String類沒有子類,因爲是final修飾的
3)abstract:抽象的
抽象方法:只有方法的聲明,沒有方法的實現
抽象類:
1)抽象方法必須放在放在抽象類中,抽象類中不一定有抽象方法
2)抽象類不能有實例
3)抽象類有構造器,其構造器不能用來產生本類對象,在子類產生對象時,間接調用該構造器
4)抽象類有父類,父類可以是抽象類,也可以是非抽象類
5)抽象類中可以有抽象方法,也可以由非抽象的方法
6)abstract不能與private/static/final一起使用
7)抽象類的所有抽象方法需要在子類中重寫,如果只重寫一部分,則子類仍然是抽象類
在下列情況下,一個類必須聲明爲抽象類:
1)當一個類的一個或多個方法是抽象方法時
2)當類是一個抽象類的子類,並且沒有實現父類的所有抽象方法,即只實現部分
3)當一個類實現一個接口,並且不能爲全部抽象方法都提供實現時
4)interface:標準/規範, 沒有構造器也沒有實例
訪問權限:
只能是public,默認public
成員:
常量: public static final
抽象方法:
默認方法:有方法體,jdk1.8以上
作用:
模擬實現了多繼承,將毫無關係的類根據某個特徵關聯起來
聲明:
[訪問修飾符] interface 接口名 {}
類和類之間:單繼承 extends
類和接口之間:多實現 implements
接口和接口之間:多繼承 extends
單例模式:
要點:
1)某個類只能有一個實例
2)它必須自行創建這個示例
3)必須自行向整個系統提供這個實例
步驟:
1)構造器私有
2)產生本類唯一一個靜態實例
3)公開一個靜態的方法返回該實例
多例模式:負載平衡
接口和抽象類的相同點與異同點:
相同點:
1)都是抽象類型
2)都可以有實現方法(以前接口不行,jdk1.8才支持)
3)都可以不需要實現類或者繼承者去實現所有方法(以前不行,現在接口中的默認方法不需要實現者去實現)
異同點:
1)抽象類不可以多重繼承,接口可以(無論是多重類型繼承還是多重行爲繼承)
2)抽象類和接口所反映出的設計理念不同,抽象類表示的是"is-a"的關係,而接口表示的是"like-a"的關係
3)接口中定義的變量默認是public static final型, 且必須給其初始值,所以實現類中不能重新定義,也不能改變其值;抽象類中的變量默認是friendly型,其值可以在子類中重新定義,也可以重新賦值