面向?qū)ο?/h2>
對(duì)象實(shí)例化過(guò)程
- 看方法區(qū)是否存在該對(duì)象類(lèi)型,沒(méi)有就使用類(lèi)加載器去加載
- 在棧中創(chuàng)建對(duì)象類(lèi)型的變量,在堆中開(kāi)辟內(nèi)存空間創(chuàng)建對(duì)象,變量保存了指向?qū)ο蟮膬?nèi)存地址,兩者是引用關(guān)系.
對(duì)象的生命周期
- new 的時(shí)候創(chuàng)建對(duì)象.
- 當(dāng)沒(méi)有任何變量引用該對(duì)象時(shí),該對(duì)象就變成了垃圾對(duì)象,等待GC的回收,這時(shí)我們也不能再使用到該對(duì)象.
- GC回收并不是即時(shí)發(fā)生的,取決于jvm的調(diào)度,程序員無(wú)法控制.
匿名對(duì)象
- new創(chuàng)建后沒(méi)有定義變量來(lái)引用的對(duì)象 如:new Test();
- 只在堆中開(kāi)辟內(nèi)存空間, 在棧中不存在對(duì)它的引用
- 使用一次之后就變成垃圾對(duì)象. 當(dāng)希望某個(gè)對(duì)象只使用一次時(shí),就可以創(chuàng)建匿名對(duì)象.
static修飾的類(lèi)成員
隨著類(lèi)的加載而加載(生命周期和類(lèi)一樣長(zhǎng))
優(yōu)先于對(duì)象存在,當(dāng)字節(jié)碼文件被加載進(jìn)jvm的時(shí)候就存在,對(duì)象是后面new出來(lái)的.
被所有對(duì)象共享
-
可以直接被類(lèi)名調(diào)用
使用:
利處:對(duì)對(duì)象的共享數(shù)據(jù)進(jìn)行單獨(dú)空間的存儲(chǔ)赠涮,節(jié)省空間,沒(méi)有必要每一個(gè)對(duì)象中都存儲(chǔ)一份,可以直接被類(lèi)名調(diào)用。
弊端:生命周期過(guò)長(zhǎng)
深入變量
分類(lèi)
對(duì)象實(shí)例化過(guò)程
對(duì)象的生命周期
匿名對(duì)象
static修飾的類(lèi)成員
隨著類(lèi)的加載而加載(生命周期和類(lèi)一樣長(zhǎng))
優(yōu)先于對(duì)象存在,當(dāng)字節(jié)碼文件被加載進(jìn)jvm的時(shí)候就存在,對(duì)象是后面new出來(lái)的.
被所有對(duì)象共享
可以直接被類(lèi)名調(diào)用
使用:
利處:對(duì)對(duì)象的共享數(shù)據(jù)進(jìn)行單獨(dú)空間的存儲(chǔ)赠涮,節(jié)省空間,沒(méi)有必要每一個(gè)對(duì)象中都存儲(chǔ)一份,可以直接被類(lèi)名調(diào)用。
弊端:生命周期過(guò)長(zhǎng)
分類(lèi)
成員變量
- 直接定義在類(lèi)里面的變量,又稱(chēng)為全局變量或者字段
- 初始化:基礎(chǔ)數(shù)據(jù)類(lèi)型統(tǒng)統(tǒng)是0,引用類(lèi)型是null,boolean類(lèi)型是false
局部變量
- 除了全局變量,其他的都是局部變量
根據(jù)位置劃分為:方法形參暗挑,方法內(nèi)變量世囊,代碼塊變量。
局部變量沒(méi)有初始值窿祥,所以使用前要顯示給初始化株憾。
變量的作用域和生命周期
作用域:
- 成員變量:在類(lèi)中聲明,作用域是整個(gè)類(lèi)晒衩。
- 局部變量:作用域是定義開(kāi)始到定義所在的花括號(hào)結(jié)束
生命周期:
變量的生命周期指的是一個(gè)變量被創(chuàng)建并分配內(nèi)存空間開(kāi)始嗤瞎,到該變量被銷(xiāo)毀并清除其所占內(nèi)存空間的過(guò)程。
**類(lèi)變量** -> 類(lèi)中定義, 被static修飾 -> 從字節(jié)碼加載開(kāi)始,字節(jié)碼被卸載時(shí)結(jié)束.
**實(shí)例變量** -> 類(lèi)中定義, 無(wú)static修飾 -> new對(duì)象開(kāi)始,對(duì)象被銷(xiāo)毀時(shí)結(jié)束
**局部變量** -> 定義在方法,代碼塊,方法形參 -> 所在方法被調(diào)用開(kāi)始,方法調(diào)用結(jié)束時(shí)結(jié)束
局部變量的初始化和在JVM中的運(yùn)行機(jī)制
-
局部變量定義后听系,必須顯示初始化后才能使用,
直到程序?yàn)檫@個(gè)變量初始化賦值時(shí)贝奇,系統(tǒng)才會(huì)為局部變量分配內(nèi)存,并將初始值保存到該棧幀內(nèi)存中靠胜。
基本數(shù)據(jù)局部變量:直接把這個(gè)變量的值保存到該變量所對(duì)應(yīng)的棧內(nèi)存中掉瞳。
-
引用數(shù)據(jù)局部變量:這個(gè)變量在棧內(nèi)存中存的是堆中的一個(gè)地址,地址指向堆中的對(duì)象,變量可以通過(guò)地址引用該對(duì)象。
內(nèi)存中的局部變量無(wú)需系統(tǒng)垃圾回收浪漠,其往往隨方法或代碼塊的運(yùn)行結(jié)束而結(jié)束陕习。
修飾符
訪(fǎng)問(wèn)權(quán)限修飾符:
- private(類(lèi)私有):本類(lèi)內(nèi)部可以訪(fǎng)問(wèn),不能被子類(lèi)繼承址愿。
- 無(wú)(包私有):本類(lèi)內(nèi)部可以訪(fǎng)問(wèn)该镣,同包其他類(lèi)也可以訪(fǎng)問(wèn),能被同包的子類(lèi)繼承响谓。
- protected(包和子類(lèi)私有):本類(lèi)內(nèi)部可以訪(fǎng)問(wèn)损合,不同包的子類(lèi)也可以訪(fǎng)問(wèn),同包其他類(lèi)也可以訪(fǎng)問(wèn)娘纷,能被子類(lèi)所繼承嫁审。
-
public(公共):任何地方都可以訪(fǎng)問(wèn),能繼承到子類(lèi)赖晶。
注意:類(lèi)的訪(fǎng)問(wèn)修飾符只有 public和缺省律适,即public class A{}或者class A{}
接口的訪(fǎng)問(wèn)修飾符只有public或缺省
final 修飾符:
- 用在類(lèi)前,表示此類(lèi)不能被繼承
- 用在方法前嬉探,表示此方法不能被覆寫(xiě)
-
用在變量,表示此變量是常量,不可改變,且變量名要全部大寫(xiě),單詞間用_隔開(kāi)
修飾基本類(lèi)型變量:表示該變量的值不能改變擦耀,即不能用“=”號(hào)重新賦值。
修飾引用類(lèi)型變量:表示該變量的引用的地址不能變涩堤,引用地址里的內(nèi)容可以改,例如數(shù)組可以用ARR[索引]來(lái)改變眷蜓。
abstract修飾符
- 用在類(lèi)前,表示此類(lèi)是抽象類(lèi)
- 2.用在方法,表示此類(lèi)是抽象方法.
static 修飾符
- 表示是靜態(tài)成員,可以用類(lèi)名直接調(diào)用,
- 只能訪(fǎng)問(wèn)類(lèi)成員,不能訪(fǎng)問(wèn)對(duì)象成員;
- 被所有對(duì)象共享;
面向?qū)ο?繼承
子類(lèi)繼承了:
- 1):SubClass類(lèi)能繼承SuperClass類(lèi)中的public和protected成員(字段、方法胎围、內(nèi)部類(lèi))吁系。靜態(tài)方法也可以被繼承,只是不能被復(fù)寫(xiě)
- 2):當(dāng)SubClass和SuperClass類(lèi)是位于同一包中德召,SubClass類(lèi)會(huì)繼承SuperClass類(lèi)中的默認(rèn)訪(fǎng)問(wèn)權(quán)限成員(缺省)。
-
3):私有成員汽纤、構(gòu)造器上岗,絕對(duì)繼承不到。
Java只支持單繼承,不支持多繼承蕴坪,但是允許多重繼承肴掷,java.lang.Object是所有類(lèi)(除了Object)的根類(lèi),Object要么是直接父類(lèi)要么是間接父類(lèi)背传。
方法重寫(xiě)
企鵝(Penguin)和鴕鳥(niǎo)(Ostrich)是鳥(niǎo)類(lèi)中的一個(gè)特殊品種呆瞻,所以企鵝/鴕鳥(niǎo)類(lèi)是鳥(niǎo)類(lèi)的一個(gè)子類(lèi),但是鳥(niǎo)類(lèi)有飛翔的功能径玖,但是對(duì)應(yīng)企鵝/鴕鳥(niǎo)痴脾,飛翔的行為顯然不適合于它。
此時(shí)就要進(jìn)行方法的覆寫(xiě)或者重寫(xiě),意思就是在子類(lèi)中重新編寫(xiě)方法體
重寫(xiě)原則:
建立在能繼承的基礎(chǔ)上梳星,不能繼承的方法不能改寫(xiě)赞赖!
- ① 實(shí)例方法簽名必須相同。 (方法簽名= 方法名 + 方法的參數(shù)列表)
- ② 子類(lèi)方法的返回值類(lèi)型是父類(lèi)方法的返回值類(lèi)型的子類(lèi)或相同類(lèi)冤灾。
③ 子類(lèi)方法聲明拋出的異常應(yīng)比父類(lèi)方法聲明拋出的異常更小或相等前域。
子類(lèi)方法中聲明拋出的異常小于或等于父類(lèi)方法聲明拋出異常類(lèi)型;
子類(lèi)方法可以同時(shí)聲明拋出多個(gè)屬于父類(lèi)方法聲明拋出異常類(lèi)的子類(lèi)(RuntimeException類(lèi)型除外)瞳购;-
④ 子類(lèi)方法的訪(fǎng)問(wèn)權(quán)限比父類(lèi)方法訪(fǎng)問(wèn)權(quán)限更大或相等话侄。
判斷是否是覆寫(xiě)方法的必殺技:@Override標(biāo)簽:若方法是覆寫(xiě)方法亏推,在方法前或上貼上該注解学赛, 編譯通過(guò)表示覆寫(xiě)成功,否則吞杭,編譯報(bào)錯(cuò)盏浇。
super關(guān)鍵字
- ① 在子類(lèi)中訪(fǎng)問(wèn)父類(lèi)的被隱藏的字段和被覆寫(xiě)的方法。
- ② 在子類(lèi)的構(gòu)造方法中芽狗,可使用super語(yǔ)句調(diào)用該類(lèi)的父類(lèi)的指定構(gòu)造器绢掰。super(參數(shù))
- 如果父類(lèi)沒(méi)有無(wú)參構(gòu)造,則必須使用super手動(dòng)調(diào)用父類(lèi)的構(gòu)造器童擎,否則編譯不能通過(guò)
this關(guān)鍵字
- ① 解決成員變量和方法參數(shù)之間的二義性,必須使用(比如setter方法中);
- ② 同類(lèi)中實(shí)例方法間互調(diào) this.getName(); 在本類(lèi)找時(shí),this可以忽略
- ③ 講當(dāng)前對(duì)象作為方法的返回值(鏈?zhǔn)椒椒ň幊?;
- ④ 構(gòu)造器重載的互調(diào)滴劲,在當(dāng)前構(gòu)造器中調(diào)用當(dāng)前重載的構(gòu)造器,this([參數(shù)])必須寫(xiě)在構(gòu)造方法第一行,也表示只能有一個(gè)this(參數(shù));
- ⑤ static不能和this一起使用顾复,static的成員在類(lèi)加載到JVM就存在了班挖,而this表示的是堆中的對(duì)象,該對(duì)象還不存在;
隱藏(小結(jié))
- 滿(mǎn)足繼承的訪(fǎng)問(wèn)權(quán)限下芯砸,隱藏父類(lèi)字段:若子類(lèi)中定義的字段和父類(lèi)中的字段名相同(不管類(lèi)型)萧芙,此時(shí)就是隱藏父類(lèi)字段给梅,此時(shí)只能通過(guò)super訪(fǎng)問(wèn)被隱藏的字段。
- 隱藏本類(lèi)字段:若同類(lèi)中某局部變量名和字段名相同双揪,此時(shí)就是隱藏本類(lèi)字段动羽,此時(shí)只能通過(guò)this訪(fǎng)問(wèn)被隱藏的字段。
- 滿(mǎn)足繼承的訪(fǎng)問(wèn)權(quán)限下渔期,隱藏父類(lèi)靜態(tài)方法:若子類(lèi)定義的靜態(tài)方法的簽名和父類(lèi)中的靜態(tài)方法簽名相同运吓,那么此時(shí)就是隱藏父類(lèi)靜態(tài)方法。
面向?qū)ο?多態(tài)
編譯類(lèi)型和運(yùn)行類(lèi)型
如:Animal a = new Dog();
此時(shí)對(duì)象a的類(lèi)型有兩種:
- 編譯時(shí)類(lèi)型:聲明該變量時(shí)使用的類(lèi)型疯趟,表示把對(duì)象看做是什么類(lèi)型:Animal
- 運(yùn)行時(shí)類(lèi)型:創(chuàng)建對(duì)象的類(lèi)型——對(duì)象的真正類(lèi)型羽德,表示對(duì)象實(shí)際上是什么類(lèi)型:Dog
多態(tài)的特點(diǎn)
Animal a = null;
a = new Cat();//此時(shí)a表示貓
a = new Dog();//此時(shí)a表示狗
可以看出對(duì)象a會(huì)出現(xiàn)多種形態(tài)的情況。此時(shí)我們把這種父類(lèi)指向了子類(lèi)對(duì)象的引用的現(xiàn)象稱(chēng)為多態(tài)迅办。
- 用父類(lèi)的類(lèi)型來(lái)聲明變量,并引用了子類(lèi)的對(duì)象,在運(yùn)行時(shí)體現(xiàn)出了子類(lèi)的特征.
- 用接口的類(lèi)型來(lái)聲明變量,并引用了實(shí)現(xiàn)類(lèi)的對(duì)象,在運(yùn)行時(shí)表現(xiàn)了實(shí)現(xiàn)類(lèi)的行為特征.
多態(tài)的方法調(diào)用問(wèn)題
若SuperC是SubC的父類(lèi)或其接口:
SuperC s = new SubC();
s.doWork();
- 若doWork方法只存在于SubC類(lèi)中宅静,不存在于SuperC類(lèi)中。不能由父類(lèi)型來(lái)調(diào)用
- 若doWork方法是SuperC和SubCs類(lèi)中的靜態(tài)方法站欺,此時(shí)子類(lèi)doWork方法被隱藏姨夹,調(diào)用的是父類(lèi)的doWork方法,此時(shí)變量s調(diào)用doWork方法時(shí)不具備多態(tài)特征矾策,也就不存在多態(tài)磷账。底層依然是類(lèi)名掉用
- 若doWork方法是子類(lèi)覆寫(xiě)父類(lèi)的方法,此時(shí)變量s調(diào)用的doWork方法實(shí)際上是子類(lèi)里的doWork方法贾虽。(運(yùn)行多態(tài))
構(gòu)造代碼塊
特點(diǎn):
優(yōu)先于構(gòu)造方法執(zhí)行,每次實(shí)例化對(duì)象之前都會(huì)執(zhí)行構(gòu)造代碼塊逃糟。
其實(shí)編譯時(shí)就是把這個(gè)代碼塊中的代碼放到了構(gòu)造方法中代碼的前面。
類(lèi)實(shí)例化時(shí)的初始順序:
成員變量的賦值 -> 構(gòu)造代碼塊 -> 構(gòu)造方法
靜態(tài)代碼塊
使用static修飾的構(gòu)造代碼塊,稱(chēng)為靜態(tài)代碼塊,用于初始化類(lèi)中的靜態(tài)成員變量.
特點(diǎn):
- 當(dāng)字節(jié)碼被加載到JVM的時(shí)候自動(dòng)執(zhí)行
- 只會(huì)執(zhí)行1次
類(lèi)實(shí)例化時(shí)的初始順序:
靜態(tài)代碼塊 -> 構(gòu)造代碼塊 -> 構(gòu)造方法
Java設(shè)計(jì)模式
分類(lèi)
- 創(chuàng)建型模式蓬豁,共五種:工廠(chǎng)方法模式绰咽、抽象工廠(chǎng)模式、單例模式地粪、建造者模式取募、原型模式。
- 結(jié)構(gòu)型模式蟆技,共七種:適配器模式玩敏、裝飾器模式、代理模式质礼、外觀(guān)模式旺聚、橋接模式、組合模式眶蕉、享元模式砰粹。
- 行為型模式,共十一種:策略模式妻坝、模板方法模式伸眶、觀(guān)察者模式惊窖、迭代子模式、責(zé)任鏈模式厘贼、命令模式界酒、備忘錄模式、狀態(tài)模式嘴秸、訪(fǎng)問(wèn)者模式毁欣、中介者模式、解釋器模式岳掐。
單例模式`
目的:保證某一個(gè)類(lèi)在整個(gè)應(yīng)用中有且只有一個(gè)實(shí)例(一個(gè)類(lèi)在內(nèi)存只存在一個(gè)對(duì)象)凭疮,即所有指向該類(lèi)型實(shí)例的引用都指向同一塊內(nèi)存空間。
private static instance ;
private $CLASS_NAME$($param1$){
$init$
}
public static $CLASS_NAME$ getInstance($param1$){
if (instance == null) {
synchronized ($CLASS_NAME$.class){
if (instance == null) {
instance = new $CLASS_NAME$($param2$) ;
}
}
}
return instance ;
}
享元模式
以基本類(lèi)型包裝類(lèi)為例:
Byte串述、Short执解、Integer、Long:緩存[-128纲酗,127]區(qū)間的數(shù)據(jù)衰腌;
Character:緩存[0,127]區(qū)間的數(shù)據(jù)觅赊;
當(dāng)取值范圍在這區(qū)間時(shí),不會(huì)重新創(chuàng)建對(duì)象,而是直接從緩存中獲取對(duì)象.
特點(diǎn):
把經(jīng)常使用的數(shù)據(jù)先緩存起來(lái),以后要用的時(shí)候直接去緩存中獲取,緩存中沒(méi)有再創(chuàng)建,使用享元模式后能夠提高系統(tǒng)的性能和不會(huì)帶來(lái)更多的復(fù)雜度時(shí)
模板方法設(shè)計(jì)模式
public abstract Class template{
//模板方法 子類(lèi)不能復(fù)寫(xiě)
public final protected templateMethod(){
... //相同邏輯
absMethod();
...//相同邏輯
}
protected abstract void absMethod(); //抽象方法,由子類(lèi)重寫(xiě)實(shí)現(xiàn)
}
在父類(lèi)的一個(gè)方法中定義一個(gè)總體算法的骨架右蕊,而將某一些步驟延遲到子類(lèi)中,因?yàn)椴煌淖宇?lèi)實(shí)現(xiàn)細(xì)節(jié)不同吮螺。
抽象父類(lèi)至少提供的方法:
- 模板方法:一種通用的處理方式饶囚,即模板; 通用的算法,用final修飾,不準(zhǔn)子類(lèi)重寫(xiě)
- 抽象方法:一種具體的業(yè)務(wù)功能實(shí)現(xiàn)鸠补,由子類(lèi)完成萝风;專(zhuān)門(mén)留給子類(lèi)來(lái)重寫(xiě),用protected修飾
注意:抽象父類(lèi)提供的模版方法只是定義了一個(gè)通用算法,其實(shí)現(xiàn)必須依賴(lài)子類(lèi)的輔助莫鸭。
組合模式
解決代碼復(fù)用問(wèn)題:
組合關(guān)系/包含關(guān)系:"has A"關(guān)系.
在一個(gè)類(lèi)中包含了另一個(gè)類(lèi)型(基本類(lèi)型和引用類(lèi)型)的成員變量,通過(guò)對(duì)傳入這類(lèi)型的對(duì)象后可以在本類(lèi)中使用其他類(lèi)的功能
interface SIM{
打電話(huà)();
}
class 移動(dòng) implement SIM{
重寫(xiě)方法...
}
class 手機(jī){
//手機(jī)要打電話(huà),打電話(huà)的方法在SIM接口中,此時(shí)我們使用組合模式,即不繼承SIM
SIM sim ;
手機(jī)(SIM sim){//傳入SIM的實(shí)現(xiàn)對(duì)象,手機(jī)就可以達(dá)到打電話(huà)了
this.sim = sim;
}
打電話(huà)(){
sim.打電話(huà)();
}
}
抽象類(lèi)
抽象類(lèi)需要的部分功能,由于自己不能實(shí)現(xiàn),而交由子類(lèi)去實(shí)現(xiàn),此時(shí)就需要定義抽象方法,讓子類(lèi)去重寫(xiě),實(shí)現(xiàn)具體功能.
特點(diǎn):
使用abstract關(guān)鍵字修飾的類(lèi)闹丐。
- 不能創(chuàng)建實(shí)例即不能new一個(gè)抽象類(lèi)。
- 可以不包含抽象方法被因,若一旦包含,該類(lèi)必須作為抽象類(lèi)衫仑。
- 若子類(lèi)沒(méi)有實(shí)現(xiàn)父類(lèi)所有的抽象方法梨与,那么子類(lèi)也得作為抽象類(lèi)(抽象派生類(lèi))。
- 構(gòu)造方法不能全部定義成私有的文狱,否則不能有子類(lèi)(創(chuàng)建子類(lèi)對(duì)象前先調(diào)用父類(lèi)構(gòu)造方法)粥鞋。
- 抽象類(lèi)不能使用final修飾,因?yàn)楸仨氂凶宇?lèi)瞄崇,抽象方法才能得以實(shí)現(xiàn)呻粹。
- 是不完整的類(lèi)壕曼,需作為基類(lèi),功能留給子類(lèi)實(shí)現(xiàn)等浊。
接口
例子:
主板提供了USB規(guī)范的插槽(F類(lèi)中向外提供了一個(gè)傳遞I接口類(lèi)型參數(shù)的公共方法),一個(gè)遵循USB規(guī)范的鼠標(biāo)(一個(gè)實(shí)現(xiàn)了I接口的IMPL類(lèi)),就可以插入主板(向F類(lèi)中傳遞實(shí)例對(duì)象),與主板正常通信(IMPL類(lèi)可與F類(lèi)進(jìn)行數(shù)據(jù)交互),主板不需要關(guān)心鼠標(biāo)是怎么生產(chǎn)的,內(nèi)部是怎么樣的(F類(lèi)只需調(diào)用IMPL類(lèi)已實(shí)現(xiàn)的接口方法即可,不需要關(guān)心怎么實(shí)現(xiàn)).鼠標(biāo)壞了也不會(huì)影響主板.
接口定義一種規(guī)范腮郊,規(guī)定某一類(lèi)事物類(lèi)必須具備某些功能,但它不管類(lèi)如何具體實(shí)現(xiàn)這些功能筹燕。
特點(diǎn):
- 沒(méi)有構(gòu)造方法轧飞,不能實(shí)例化。
- 接口只能繼承接口撒踪,不能繼承類(lèi)过咬,且接口支持多繼承。
- 接口里的方法方法全是抽象的制妄,默認(rèn)修飾符是public abstract掸绞。
- 接口里的字段全是全局靜態(tài)常量,默認(rèn)修飾符是public static final耕捞。
- 接口里的內(nèi)部類(lèi)(包括內(nèi)部類(lèi)集漾、內(nèi)部接口、內(nèi)部枚舉)全是靜態(tài)的砸脊,默認(rèn)修飾符是public static具篇。
接口和抽象類(lèi)
相同點(diǎn):
- 都位于繼承的頂端,用于被其他實(shí)現(xiàn)或繼承凌埂。
- 都不能實(shí)例化驱显。
- 都可以定義抽象方法,其子類(lèi)都必須覆寫(xiě)這些抽象方法瞳抓。
區(qū)別:
- 接口沒(méi)有構(gòu)造方法埃疫,抽象類(lèi)有構(gòu)造方法。
- 抽象類(lèi)可包含普通方法和抽象方法孩哑,接口只能包含抽象方法;
-
一個(gè)類(lèi)只能繼承一個(gè)直接父類(lèi)(可能是抽象類(lèi))栓霜,卻可以實(shí)現(xiàn)多個(gè)接口(接口彌補(bǔ)了Java的單繼承)。
變量:接口里默認(rèn)是public static final横蜒,抽象類(lèi)是默認(rèn)包權(quán)限胳蛮。
方法:接口里默認(rèn)是public abstract,抽象類(lèi)默認(rèn)是默認(rèn)包訪(fǎng)問(wèn)權(quán)限丛晌。
內(nèi)部類(lèi):接口里默認(rèn)是public static仅炊,抽象類(lèi)默認(rèn)是默認(rèn)包訪(fǎng)問(wèn)權(quán)限。
二者的選用:
優(yōu)先選用接口澎蛛,盡量少用抽象類(lèi)抚垄。若需要定義子類(lèi)的行為,又要為子類(lèi)提供共性功能時(shí)選用抽象類(lèi)。
面向接口編程
我們以后所看到的多態(tài)形式都是大多數(shù)都是接口和實(shí)現(xiàn)類(lèi)之間關(guān)系
接口類(lèi)型 變量 = new 接口實(shí)現(xiàn)類(lèi)
面向接口編程的好處在于能屏蔽不同子類(lèi)之間的差異呆馁,使用一種規(guī)范去表示他們的行為桐经,達(dá)到通用編程(多態(tài)的好處)的好處
我們以后在類(lèi)中出現(xiàn)要?jiǎng)?chuàng)建對(duì)象的時(shí)候,統(tǒng)統(tǒng)都不new對(duì)象浙滤,改為使用工廠(chǎng)模式來(lái)生產(chǎn)對(duì)象阴挣,但是要生產(chǎn)怎樣的對(duì)象才是我們要的呢?在類(lèi)中留下一個(gè)規(guī)范瓷叫,即接口屯吊。
內(nèi)部類(lèi)
內(nèi)部類(lèi)(靜態(tài)內(nèi)部類(lèi)除外)可以訪(fǎng)問(wèn)外部類(lèi)的私有數(shù)據(jù),外部類(lèi)不能直接訪(fǎng)問(wèn)內(nèi)部類(lèi)的實(shí)現(xiàn)細(xì)節(jié)摹菠,比如字段盒卸。
四種內(nèi)部類(lèi):
-
非靜態(tài)內(nèi)部類(lèi):
ClsOut.ClsIn in = new ClsOut().new ClsIn();
-
靜態(tài)內(nèi)部類(lèi):
ClsOut.ClsIn in = new ClsOut().ClsIn;
-
局部?jī)?nèi)部類(lèi):
在方法中定義的類(lèi),若在局部?jī)?nèi)部類(lèi)對(duì)象中訪(fǎng)問(wèn)方法中的局部變量, 則變量必須加final修飾,否則方法調(diào)用結(jié)束,變量就被回收了
-
匿名內(nèi)部類(lèi)適合于僅使用一次使用的類(lèi):
適合只使用一次的類(lèi)。
不能是抽象類(lèi)次氨,因?yàn)橄到y(tǒng)在創(chuàng)建匿名內(nèi)部類(lèi)的時(shí)候蔽介,會(huì)立即創(chuàng)建匿名內(nèi)部類(lèi)的對(duì)象。
不能定義構(gòu)造器煮寡,因?yàn)槟涿麅?nèi)部類(lèi)沒(méi)有類(lèi)名虹蓄。
注意:匿名內(nèi)部類(lèi)必須繼承一個(gè)父類(lèi)或者實(shí)現(xiàn)一個(gè)接口,但最多只能一個(gè)父類(lèi)或?qū)崿F(xiàn)一個(gè)接口幸撕。
枚舉類(lèi)
枚舉的直接父類(lèi)java.lang.Enum薇组,但是不能顯示繼承Enum。
枚舉就相當(dāng)于一個(gè)類(lèi)坐儿,可以定義構(gòu)造方法律胀、成員變量、普通方法和抽象方法貌矿。
枚舉的構(gòu)造方法必須是私有的 private炭菌。
每個(gè)實(shí)例分別用一個(gè)全局常量表示,枚舉類(lèi)的對(duì)象是固定的逛漫,實(shí)例個(gè)數(shù)有限黑低,不能使用new關(guān)鍵字。
枚舉實(shí)例必須位于枚舉體中的最開(kāi)始部分酌毡,枚舉實(shí)例列表的后要有逗號(hào)與其他成員相分隔克握。
-
枚舉實(shí)例后有花括號(hào)時(shí),該實(shí)例是枚舉類(lèi)的匿名內(nèi)部類(lèi)對(duì)象(查看編譯后的class文件)阔馋。
public enum Gender{ MAN,WOMAN; }