Java基礎(chǔ) - 面向?qū)ο?/h1>

面向?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)

成員變量

  • 直接定義在類(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)限修飾符:

  1. private(類(lèi)私有):本類(lèi)內(nèi)部可以訪(fǎng)問(wèn),不能被子類(lèi)繼承址愿。
  1. 無(wú)(包私有):本類(lèi)內(nèi)部可以訪(fǎng)問(wèn)该镣,同包其他類(lèi)也可以訪(fǎng)問(wèn),能被同包的子類(lèi)繼承响谓。
  1. 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)所繼承嫁审。
  1. 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)迅办。
  1. 用父類(lèi)的類(lèi)型來(lái)聲明變量,并引用了子類(lèi)的對(duì)象,在運(yùn)行時(shí)體現(xiàn)出了子類(lèi)的特征.
  1. 用接口的類(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):

  1. 當(dāng)字節(jié)碼被加載到JVM的時(shí)候自動(dòng)執(zhí)行
  1. 只會(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 CLASS_NAME 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):

  1. 都位于繼承的頂端,用于被其他實(shí)現(xiàn)或繼承凌埂。
  1. 都不能實(shí)例化驱显。
  1. 都可以定義抽象方法,其子類(lèi)都必須覆寫(xiě)這些抽象方法瞳抓。

區(qū)別:

  1. 接口沒(méi)有構(gòu)造方法埃疫,抽象類(lèi)有構(gòu)造方法。
  1. 抽象類(lèi)可包含普通方法和抽象方法孩哑,接口只能包含抽象方法;
  1. 一個(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):

  1. 非靜態(tài)內(nèi)部類(lèi):

    ClsOut.ClsIn in = new ClsOut().new ClsIn();

  2. 靜態(tài)內(nèi)部類(lèi):

    ClsOut.ClsIn in = new ClsOut().ClsIn;

  3. 局部?jī)?nèi)部類(lèi):

    在方法中定義的類(lèi),若在局部?jī)?nèi)部類(lèi)對(duì)象中訪(fǎng)問(wèn)方法中的局部變量, 則變量必須加final修飾,否則方法調(diào)用結(jié)束,變量就被回收了

  4. 匿名內(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;
      }
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者

  • 序言:七十年代末玛荞,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子呕寝,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,743評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件下梢,死亡現(xiàn)場(chǎng)離奇詭異客蹋,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)孽江,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)讶坯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人岗屏,你說(shuō)我怎么就攤上這事辆琅。” “怎么了这刷?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,285評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵婉烟,是天一觀(guān)的道長(zhǎng)。 經(jīng)常有香客問(wèn)我暇屋,道長(zhǎng)似袁,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,485評(píng)論 1 283
  • 正文 為了忘掉前任咐刨,我火速辦了婚禮昙衅,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘定鸟。我一直安慰自己而涉,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,581評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布联予。 她就那樣靜靜地躺著啼县,像睡著了一般。 火紅的嫁衣襯著肌膚如雪躯泰。 梳的紋絲不亂的頭發(fā)上谭羔,一...
    開(kāi)封第一講書(shū)人閱讀 49,821評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音麦向,去河邊找鬼瘟裸。 笑死,一個(gè)胖子當(dāng)著我的面吹牛诵竭,可吹牛的內(nèi)容都是我干的话告。 我是一名探鬼主播,決...
    沈念sama閱讀 38,960評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼卵慰,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼沙郭!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起裳朋,我...
    開(kāi)封第一講書(shū)人閱讀 37,719評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤病线,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體送挑,經(jīng)...
    沈念sama閱讀 44,186評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡绑莺,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,516評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了惕耕。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片纺裁。...
    茶點(diǎn)故事閱讀 38,650評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖司澎,靈堂內(nèi)的尸體忽然破棺而出欺缘,到底是詐尸還是另有隱情,我是刑警寧澤挤安,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布谚殊,位于F島的核電站,受9級(jí)特大地震影響漱受,放射性物質(zhì)發(fā)生泄漏络凿。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,936評(píng)論 3 313
  • 文/蒙蒙 一昂羡、第九天 我趴在偏房一處隱蔽的房頂上張望絮记。 院中可真熱鬧,春花似錦虐先、人聲如沸怨愤。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,757評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)撰洗。三九已至,卻和暖如春腐芍,著一層夾襖步出監(jiān)牢的瞬間差导,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,991評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工猪勇, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留设褐,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,370評(píng)論 2 360
  • 正文 我出身青樓泣刹,卻偏偏與公主長(zhǎng)得像助析,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子椅您,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,527評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容