黑馬程序員-面向?qū)ο?

-------android培訓(xùn)java培訓(xùn)期待與您交流!----------

1.面向?qū)ο蟾拍?/h5>

a.面向?qū)ο蟾拍?/p>

  • 理解面向?qū)ο螅好嫦驅(qū)ο笫敲嫦蜻^程而言樊拓。是一種思想。將功能封裝進(jìn)對象,強(qiáng)調(diào)具備了功能的對象。
  • 任何事物都能抽象成對象,比如人粹胯。人都有共性:年齡,性別辰企,身高风纠,學(xué)歷等等。把人抽象成對象牢贸,而這個人對象內(nèi)部的功能可以定義成年齡竹观,性別,身高等等這些潜索;而對于外界想要調(diào)用你這個人的某個功能屬性臭增,對他來說不必關(guān)心你人對象內(nèi)部的實(shí)現(xiàn),他只管調(diào)用你的這個對象某個功能竹习,獲取他需要的結(jié)果即可誊抛。方便快捷,提高編程效率整陌。
  • 面向?qū)ο笕齻€特征:封裝拗窃、繼承、多態(tài)

b.類與對象的關(guān)系

  • 類:對現(xiàn)實(shí)生活中事物的描述泌辫。
  • 對象:就是實(shí)實(shí)在在的個體的這類事物随夸。
  • 定義:
    A. 定義類就是在描述事物,也就是在定義屬性和行為甥郑。屬性和行為共同成為類中的成員(成員變量逃魄,成員函數(shù))。
    B. 對象由new操作符來生成澜搅,在堆內(nèi)存產(chǎn)生一個實(shí)體伍俘。
  • 示例:
//定義類
    class People{
    //屬性
    public int age;
    public string name;
    ...
    //定義方法 行為
    public int age()
    {
            return age;
    }
    //對象
    People p = new People();
    p.age();
    ...
  • 成員變量和局部變量
    A.最大區(qū)別區(qū)別:作用的范圍不一樣邪锌。成員變量作用于整個類中,從屬于類癌瘾,不必初始化觅丰。局部變量作用于函數(shù)中或者語句中,必須手動初始化妨退。
    B.內(nèi)存的位置:成員變量在堆內(nèi)存中妇萄,因?yàn)閷ο蟮拇嬖诓糯嬖谟趦?nèi)存中。局部變量存在棧內(nèi)存中咬荷。
  • 匿名對象
    A.匿名對象是對象的簡化形式,沒有名字的對象冠句。格式為new 實(shí)例名稱();
    B.匿名對象兩種使用情況:
    (1).當(dāng)對對象方法僅進(jìn)行一次調(diào)用時(shí)
    (2).匿名對象可以作為實(shí)際參數(shù)進(jìn)行傳遞
new People().age = 23;
age(new People());

c.封裝
  • OOP三大特征之一。
  • 概念:指隱藏獨(dú)享的屬性和實(shí)現(xiàn)細(xì)節(jié)幸乒,僅對外提供公共訪問方式懦底。
  • 封裝的好處:將變化隔離、便于使用罕扎、提高重用性聚唐、提高安全性
  • 封裝原則:將不需要對外提供的內(nèi)容都隱藏起來、把屬性都隱藏腔召,提供公共方法對其訪問杆查。
  • private:私有權(quán)限反問修飾符。用于修飾類中的成員(成員變量臀蛛,成員函數(shù))亲桦,私有指只在本類中有效。僅僅是封裝的一種表現(xiàn)形式掺栅。

d.構(gòu)造函數(shù)

  • 特點(diǎn):函數(shù)名與類名相同烙肺、不用定義返回值類型、不可以寫return語句氧卧。
  • 作用:給對象初始化,用于對象初始化桃笙。
  • 注意:當(dāng)一個類中沒有定義構(gòu)造函數(shù)時(shí),那么系統(tǒng)會默認(rèn)給該類加入一個空參數(shù)的構(gòu)造函數(shù)沙绝,用于對象初始化搏明。當(dāng)在類中定義了初始化構(gòu)造函數(shù),默認(rèn)的構(gòu)造函數(shù)就沒有了闪檬。
  • 特點(diǎn):構(gòu)造函數(shù)和一般函數(shù)在寫法上不同星著、在運(yùn)行上也不同,構(gòu)造函數(shù)是在對象一建立就運(yùn)行粗悯,給對象初始化虚循。而一般方法是對象調(diào)用才執(zhí)行,給是對象添加對象具備的功能一個對象建立横缔,構(gòu)造函數(shù)值運(yùn)行一次铺遂,而一般方法可以被該對象調(diào)用多次。
//定義類
class People{
    //默認(rèn)構(gòu)造函數(shù)
    People(){}
}
  • 定義構(gòu)造函數(shù)的時(shí)間:當(dāng)對象需要一定的特征或者行為茎刚,就需要對其進(jìn)行構(gòu)造函數(shù)襟锐。

構(gòu)造代碼塊

//定義類
class People{
    /**
     * 作用:給對象進(jìn)行初始化
     * 特點(diǎn):對象一建立就運(yùn)行,而且優(yōu)先于構(gòu)造函數(shù)執(zhí)行膛锭,針對所有的對象進(jìn)行初始化都會先被執(zhí)行一次粮坞。
     * 和構(gòu)造函數(shù)的區(qū)別:
     *             構(gòu)造代碼塊是給所有對象進(jìn)行統(tǒng)一初始化。
     *             構(gòu)造函數(shù)時(shí)給對應(yīng)的對象進(jìn)行初始化初狰。
     * 用處:定義給不同對象的共性進(jìn)行初始化莫杈。
     */
    {
        System.out.println("構(gòu)造代碼塊");
    }
}

e.this關(guān)鍵字

  • 用于區(qū)分局部變量和成員變量同名情況。
  • this代表它所在的函數(shù)所屬對象的引用奢入。
  • this代表本類對象姓迅。
    private int age;
    private String name;

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
  • 應(yīng)用:當(dāng)定義類中功能時(shí),該函數(shù)內(nèi)部要用到調(diào)用該函數(shù)的對象是俊马,這時(shí)使用this來代表使用此對象。凡是本類功能內(nèi)部使用了本類對象肩杈,都用this表示柴我。
class People{
    private int age;

    /**
     * 構(gòu)造函數(shù)
     * @param age
     */
    People(int age)
    {
        this.age = age;
    }
    public int getAge()
    {
        return age;
    }
    public void setAge(int age)
    {
        this.age = age;
    }

    /**
     * 比較兩個人的年齡是否相等。此處的this代表當(dāng)前調(diào)用的對象的引用也就是p1扩然。
     * @param p 人的對象變量
     * @return boolean
     */
    public boolean compare(People p)
    {
        return this.age == age;
    }

    
    public static void main(String[] args) {
        People p1 = new People(20);
        People p2 = new People(23);
        boolean b = p1.compare(p2);
        System.out.println("b = " + b);

    }
}
  • this與構(gòu)造函數(shù):this用與構(gòu)造函數(shù)的之間互相調(diào)用艘儒。而且只能定義在構(gòu)造函數(shù)的第一行。因?yàn)槌跏蓟葓?zhí)行
class People{
    private int age;
    private String name;

    /**
     * 空構(gòu)造函數(shù)
     */
    People()
    {
    }

    /**
     * 構(gòu)造函數(shù)
     * @param age
     */
    People(int age)
    {
        this();//調(diào)用People()構(gòu)造函數(shù)
    }

    /**
     * 構(gòu)造函數(shù)
     * @param age
     * @param name
     */
    People(int age, String name)
    {
        this(23);//調(diào)用People(int age)構(gòu)造函數(shù)
        this.name = name;
    }

f.static關(guān)鍵字

  • static修飾符夫偶,修飾變量界睁、方法和代碼塊。
  • 當(dāng)成員被static修飾后兵拢,可以用類名直接調(diào)用翻斟。格式:類名.靜態(tài)成員。
    static String name;

    public static void main(String[] args) {
        System.out.println("People.name = " + People.name);
    }
  • 特點(diǎn):隨著類的加載而加載,靜態(tài)隨著類的消失而消失说铃,生命周期最長访惜、優(yōu)先于對象的存在、被所有對象所共享腻扇、可以直接被類名所調(diào)用债热。
  • 實(shí)例變量和靜態(tài)成員變量區(qū)別:
    A.存放位置:(1)靜態(tài)成員變量隨著類的加載而存在方法區(qū)中。(2)實(shí)例變量隨著對象的建立而存在于堆內(nèi)存中幼苛。
    B.生命周期:(1)靜態(tài)成員變量最長窒篱,隨著類的消失而消失。(2)實(shí)例變量隨著對象的消失而消失。
  • 靜態(tài)使用注意點(diǎn):
    A.靜態(tài)方法只能訪問靜態(tài)成員(方法與變量)墙杯。非靜態(tài)方法即可以訪問靜態(tài)也可以訪問非靜態(tài)配并。
    B.靜態(tài)方法中不可以定義this、super關(guān)鍵字霍转。因?yàn)殪o態(tài)優(yōu)先于對象存在荐绝。
    C.主函數(shù)是靜態(tài)的。
  • 靜態(tài)優(yōu)缺點(diǎn):
    A.優(yōu):對對象的共享數(shù)據(jù)進(jìn)行單獨(dú)空間的存儲避消,節(jié)省空間低滩。可以直接被類名調(diào)用岩喷。
    B.缺:生命周期過長恕沫、訪問出現(xiàn)局限性(只能訪問靜態(tài))。

靜態(tài)的使用時(shí)間:

  • 靜態(tài)變量(類變量)定義:當(dāng)對象中的出現(xiàn)對象調(diào)用的共享數(shù)據(jù)時(shí)纱意,該數(shù)據(jù)被靜態(tài)所修飾存在于方法區(qū)中婶溯;對象中的特有數(shù)據(jù)定義成非靜態(tài)存在于堆內(nèi)存中。
  • 靜態(tài)函數(shù)定義:當(dāng)類中的某個功能沒有訪問到非靜態(tài)數(shù)據(jù)(對象特有的數(shù)據(jù))偷霉,那么該功能可以定義成靜態(tài)的(static)迄委。
class People{
    String name;

    //沒有關(guān)聯(lián)到非成員變量name,那么這個函數(shù)可以設(shè)置成static的类少,方便后面直接通過類名調(diào)用
    public static void show()
    {
        System.out.println("沒有訪問到成員變量");
    }

    public static void main(String[] args) {
        //調(diào)用此方法時(shí)叙身,與name沒有關(guān)系。沒有封裝進(jìn)數(shù)據(jù)硫狞⌒沤危可以不建立對象來調(diào)用,設(shè)置成static的通過類名調(diào)用方便明了残吩。
        People.show();
    }
}

靜態(tài)代碼塊

  • 格式:
    static
    {
        System.out.println("靜態(tài)代碼塊");
    }
  • 特點(diǎn):隨著類的加載而執(zhí)行财忽,只執(zhí)行一次,用于給類進(jìn)行初始化泣侮。并優(yōu)先于主函數(shù)即彪。

g.mian函數(shù)

public static void main(String[] args)
  • public:表示全局所有訪問權(quán)限最大。也就是封裝性旁瘫。
  • static:表示只能通過類調(diào)用祖凫。主函數(shù)隨著類的加載就已經(jīng)存在了。
  • void:主函數(shù)沒有具體返回值酬凳。
  • main:不是關(guān)鍵字惠况,特殊的一個詞,可以被JVM識別宁仔。
  • String[] args:函數(shù)的參數(shù)稠屠,是一個字符串?dāng)?shù)組。

主函數(shù)是固定格式:JVM識別


h.對象初始化過程:
People p = new People("zhangsan", 23);

1.因?yàn)閚ew用到了People.class,所以會先找到People.class文件并加載到內(nèi)存中权埠。
2.執(zhí)行該類中的static代碼塊榨了,如果有的話。再給People.class類進(jìn)行初始化攘蔽。
3.在堆內(nèi)存中開辟空間龙屉,分配內(nèi)存地址。
4.在堆內(nèi)存中建立對象的特有屬性满俗,并進(jìn)行默認(rèn)初始化转捕。
5.對屬性進(jìn)行顯示初始化。
6.對對象進(jìn)行構(gòu)造代碼塊初始化唆垃。
7.對對象進(jìn)行對應(yīng)的構(gòu)造函數(shù)初始化五芝。
8.將內(nèi)存地址賦給內(nèi)存中的引用變量p。


i.繼承
  • 面向?qū)ο筇卣髦?/li>
  • 把對象間的共性特征進(jìn)行抽取辕万,類與類之間有關(guān)系枢步,最后抽象成一個共性類,被抽取的類的繼承自這個共性類就可渐尿。減少代碼量醉途,提高復(fù)用性。
  • 形式:
繼承類 extends 被繼承類
  • Java只支持單繼承砖茸。支持多層繼承:B繼承A结蟋,D繼承B。D類可以使用A類的功能渔彰。
  • 繼承關(guān)系中類成員的特點(diǎn):
    A. 變量:如果子類中出現(xiàn)非私有的同名變量時(shí),子類要訪問本類中的變量推正,用this恍涂。子類要訪問父類中的同名變量,用super植榕,super跟this的使用幾乎一致再沧。super代表父類對象的引用,this代表本類對象引用尊残。
/**
 * Created by Sergio on 2014/11/2.
 */
public class ExtendsDemo1 {
    public static void main(String[] args) {
        Sun s = new Sun();
        s.show();
    }
}

class Parents{
    int num = 5;
}

//子繼承父類
class Sun extends Parents{
    int num = 4;
    void show()
    {
        System.out.println(num);//訪問的是子類的變量炒瘸,相當(dāng)于this.num
        System.out.println(super.num);//碰到同名變量可以使用super關(guān)鍵字訪問父類的變量。
    }
}

B. 函數(shù):當(dāng)父類出現(xiàn)和子類一模一樣的函數(shù)時(shí)寝衫,當(dāng)子類對象調(diào)用該函數(shù)顷扩,會運(yùn)行子類函數(shù)的內(nèi)容,如同父類的函數(shù)被覆蓋掉慰毅。這也叫做覆蓋(重寫)隘截。

/**
 * Created by Sergio on 2014/11/2.
 */
public class ExtendsDemo1 {
    public static void main(String[] args) {
        Sun s = new Sun();
        s.show();
    }
}

class Parents{
    int num = 5;
    void show()
    {
        System.out.println("被覆蓋");
    }
}

//子繼承父類
class Sun extends Parents{
    int num = 4;
    void show()
    {
        System.out.println(num);//訪問的是子類的變量,相當(dāng)于this.num
        System.out.println(super.num);//碰到同名變量可以使用super關(guān)鍵字訪問父類的變量。
    }
}

覆蓋注意點(diǎn):子類覆蓋父類婶芭,必須保證子類權(quán)限大于等于父類權(quán)限东臀,才可以叫覆蓋,否則編譯失敗犀农。靜態(tài)只能覆蓋靜態(tài)惰赋。
C. 構(gòu)造函數(shù):在對子類對象進(jìn)行初始化時(shí),父類的構(gòu)造函數(shù)也會運(yùn)行呵哨,那是因?yàn)樽宇惖臉?gòu)造函數(shù)默認(rèn)第一行有一條隱式的語句super()[會訪問父類中空參數(shù)的構(gòu)造函數(shù)赁濒。而且子類中所有的構(gòu)造函數(shù)默認(rèn)第一行都是super();];

/**
 * Created by Sergio on 2014/11/2.
 */
public class ExtendsDemo2 {
    public static void main(String[] args) {
        Sun2 s2 = new Sun2(2);
        System.out.println(s2.x);//訪問的是父類抽取的x = 4;
    }
}

class Parents2{
    int x = 4;
    Parents2()
    {
        System.out.println("fu run");
    }

    Parents2(int x)
    {
        System.out.println("x = " + x);
    }
}

//子繼承父類
class Sun2 extends Parents2{
    Sun2()
    {
        //super();隱式的構(gòu)造函數(shù)
        super(1);//根據(jù)父類構(gòu)造函數(shù)來指定
        System.out.println("zi run");
    }

    Sun2(int x)
    {
        super(3);//根據(jù)父類構(gòu)造函數(shù)來指定
        System.out.println("zi run");
    }
}

super語句一定定義在子類構(gòu)造函數(shù)的第一行仇穗,初始化動作要先做流部。子類的所有的構(gòu)造函數(shù),默認(rèn)都會訪問父類中空參數(shù)的構(gòu)造函數(shù)纹坐,因?yàn)樽宇惷恳粋€構(gòu)造函數(shù)的第一行都有一句隱式super();當(dāng)父類中沒有空參數(shù)的構(gòu)造函數(shù)時(shí)枝冀,子類必須手動通過super語句形式來指定要訪問的構(gòu)造函數(shù)。子類的構(gòu)造函數(shù)第一行也可以手動指定this語句來訪問本類中的構(gòu)造函數(shù)耘子。子類中至少會有一個構(gòu)造函數(shù)會訪問父類中的構(gòu)造函數(shù)果漾。


j. final關(guān)鍵字
  • 解釋:最終。修飾符谷誓。
  • 修飾的范圍:類绒障、函數(shù)、變量捍歪。
  • 特點(diǎn):被final修飾的類不可以被繼承户辱,為了避免被繼承,被子類復(fù)寫功能糙臼。
  • final類:被final修飾的類不可以復(fù)寫庐镐。
  • final變量:被final修飾的變量是一個常量只能賦值一次,既可以修飾成員變量变逃,又可以修飾局部變量必逆。
  • 使用的時(shí)候。描述事物時(shí)揽乱,一些數(shù)據(jù)的出現(xiàn)值是固定的名眉。可以用一個常量來表示凰棉。
  • 命名:常量的書寫規(guī)范所有字母都大寫损拢。如果有多個單詞定義,每個單詞通過"_"鏈接撒犀。P_AI探橱。比如PI申屹。

k. 抽象類
  • 多個類出現(xiàn)相同功能,但是功能主體不同隧膏,進(jìn)行向上抽取哗讥,只抽取功能定義,而不抽取功能主題胞枕。
  • 定義方式:abstract 類名包含抽象方法和非抽象方法杆煞、abstract 方法名();抽象方法只有方法名沒有方法內(nèi)容。
  • 注意:抽象方法只存在于抽象類中腐泻。抽象類不可以用new創(chuàng)建對象决乎,因?yàn)檎{(diào)用抽象方法沒有意義。抽象方法要被使用派桩,必須由子類復(fù)寫所有的抽象方法后构诚,建立子類對象調(diào)用;如果子類只覆蓋了部分抽象方法铆惑,那么該子類還是一個抽象類范嘱,因?yàn)槌橄蠓椒ㄖ淮嬖谟诔橄箢愔小?/li>
  • 抽象類不可以實(shí)例化,沒意義。

l. 接口
  • 格式:interface 接口名{}员魏。接口中定義常量丑蛤、方法固定修飾符如下(修飾符可以省略,interface會自動加上撕阎。):
    A. 常量:public static final
    B. 方法:public abstract
    接口中的成員都是public受裹。接口中的方法都是抽象的。
/**
 * Created by Sergio on 2014/11/3.
 */
interface InterfaceDemo {
    public static final int NUM = 3;//變量定義
    public abstract void intefaceDemo();//方法定義
}


//接口必須被子類實(shí)現(xiàn)用關(guān)鍵字implements虏束,接口可以被多個子類實(shí)現(xiàn)棉饶。子類也可以繼承于一個父類。必須將接口中的所有方法實(shí)現(xiàn)因?yàn)榻涌谥械姆椒ǘ际浅橄蟮?class InterfaceTest extends ExtendsDemo2 implements InterfaceDemo,InterfaceDemo2....{
    @Override
    public void intefaceDemo() {

    }
}

接口是不可以創(chuàng)建對象的镇匀,因?yàn)橛谐橄蠓椒ù嬖谂檠巍P枰蛔宇悓?shí)現(xiàn),覆蓋接口中的抽象方法后坑律,子類才可以實(shí)例化,否則子類是一個抽象類囊骤。
接口與接口之間的關(guān)系是繼承關(guān)系晃择,支持多繼承關(guān)系。

  • 接口特點(diǎn):
    -. 接口是對外暴露的規(guī)則
    -. 接口是程序的功能擴(kuò)展
    -. 接口可以用來多實(shí)現(xiàn)
    -. 類與接口之間是實(shí)現(xiàn)關(guān)系也物,而且類可以繼承一個類的同時(shí)實(shí)現(xiàn)多個接口
    -. 接口與接口之間可以有繼承關(guān)系

m. 多態(tài)與關(guān)鍵字instanceof

一. 概念

  • 面向?qū)ο筇卣髦?/li>
  • 概念:事物存在的多種體現(xiàn)形態(tài)宫屠。比如人分為:男人、女人滑蚯。人 r = new 男人(); 人 r2 = new 女人();

二. 多態(tài)擴(kuò)展性

  1. 多態(tài)的體現(xiàn):父類的引用指向了自己的子類對象(父類)浪蹂。
  2. 多態(tài)的前提:類與類之間有關(guān)系抵栈,有繼承或者實(shí)現(xiàn)。
  3. 多態(tài)的益處:多態(tài)的出現(xiàn)提高了程序的擴(kuò)展性坤次,通常有前提條件是:存在覆蓋古劲。
  4. 多態(tài)的弊端:只能使用父類的引用訪問父類中的成員。
  5. 多態(tài)中成員的特點(diǎn):
    • 非靜態(tài)成員函數(shù):
      a. 在編譯時(shí)期:參與引用型變量所屬的類中是否有調(diào)用的方法缰猴,如果有編譯通過产艾,如果沒有編譯失敗。
      b. 在運(yùn)行時(shí)期:參與對象所屬的類中是否有調(diào)用的方法滑绒。
      總結(jié)就是:成員函數(shù)在多態(tài)調(diào)用時(shí)闷堡,編譯看左邊,運(yùn)行看右邊疑故。
    • 成員變量:
      無論編譯和運(yùn)行:都參考左邊(引用型變量所屬的類)
    • 靜態(tài)成員函數(shù)(子類不覆蓋父類方法杠览,父類走父類,子類走子類纵势。變量也一樣踱阿。):
      無論編譯和運(yùn)行:都參考左邊
/**
 * Created by Sergio on 2014/11/19.
 */
public class PolymorphicDemo {
    public static void main(String[] args) {
        //調(diào)用子類覆蓋父類的eat()方法,有局限性在這點(diǎn)上
        function(new Dog());
        function(new Pig());
    }

    //定義共性的功能方法eat()
    public static void function(Animal a)
    {
        a.eat();
    }
}

/**
 * 集中抽象功能的父類Animal
 */
abstract class Animal{
    abstract void eat();
}


/**
 * 定義Dog類繼承之Animal父類吨悍,并且擁有自己的特定功能類houseKeeping().
 */
class Dog extends Animal{
    //覆蓋父類eat()方法
    public void eat()
    {
        System.out.println("Dog.eat");
    }

    //子類特有的方法
    public void houseKeeping()
    {
        System.out.println("看家");
    }
}


/**
 * 定義Pig類繼承之Animal父類扫茅,并且擁有自己的特定功能類fat().
 */
class Pig extends Animal{
    //覆蓋父類eat()方法
    public void eat()
    {
        System.out.println("Pig.eat");
    }

    //子類特有的方法
    public void fat()
    {
        System.out.println("養(yǎng)膘");
    }
}

三. 父類、子類類型轉(zhuǎn)型

/**
 * Created by Sergio on 2014/11/19.
 */
public class PolymorphicDemo {
    public static void main(String[] args) {
        //類型提升育瓜,向上轉(zhuǎn)型葫隙。將Dog類型提升為Animal類型
        Animal a = new Dog();
        a.eat();

        /**
         * 如果要調(diào)用子類特有的方法操作:強(qiáng)制將父類的引用轉(zhuǎn)成子類類型,向下轉(zhuǎn)型.將父類a引用強(qiáng)制轉(zhuǎn)換成子類類型Dog躏仇。
         *
         * 注意:不能將父類對象轉(zhuǎn)成子類類型恋脚。能轉(zhuǎn)換的是父類指向了自己的子類對象時(shí),該引用可以被提升也可以強(qiáng)制轉(zhuǎn)換焰手。
         * 多態(tài)始終都是子類在作者變化糟描。
         */
        Dog d = (Dog)a;
        d.houseKeeping();

        //fun函數(shù)調(diào)用子類對象的功能
        fun(new Dog());
        fun(new Pig());
    }

    //提煉共性函數(shù)特征fun(Animal a)
    public static void fun(Animal a)
    {
        a.eat();

        /**
         * 判斷傳遞進(jìn)來的子類是那個對象的。使用關(guān)鍵字instanceof,判斷左邊對象是否屬于右邊類的實(shí)例书妻,返回boolean
         * 類型數(shù)據(jù)船响。
         *
         * instanceof是一個二元操作符。使用的前提:1.子類型有限躲履、2.對象需要做比較首先判斷是否屬于某個類的實(shí)例
         */
        if (a instanceof Dog){
            Dog d = (Dog)a;
            d.houseKeeping();
        }
        else if(a instanceof Pig)
        {
            Pig p = (Pig)a;
            p.fat();
        }
    }
}

/**
 * 集中抽象功能的父類Animal
 */
abstract class Animal{
    abstract void eat();
}


/**
 * 定義Dog類繼承之Animal父類见间,并且擁有自己的特定功能類houseKeeping().
 */
class Dog extends Animal{
    //覆蓋父類eat()方法
    public void eat()
    {
        System.out.println("Dog.eat");
    }

    //子類特有的方法
    public void houseKeeping()
    {
        System.out.println("看家");
    }
}


/**
 * 定義Pig類繼承之Animal父類,并且擁有自己的特定功能類fat().
 */
class Pig extends Animal{
    //覆蓋父類eat()方法
    public void eat()
    {
        System.out.println("Pig.eat");
    }

    //子類特有的方法
    public void fat()
    {
        System.out.println("養(yǎng)膘");
    }
}

四:小示例

package com.sergio.lianxi;

/**
 * Created by Sergio on 2014/11/20.
 *
 * 需求:電腦運(yùn)行實(shí)例工猜。電腦運(yùn)行基于主板米诉。
 */
public class PolymorphicDemo2 {
    public static void main(String[] args) {
        MotherBoard mb = new MotherBoard();
        mb.run();
        mb.usePCI(new SoundCard());
    }

}

/**
 * 電腦的各種部件基于電腦主板上的pci接口運(yùn)行。模擬PCI接口篷帅。
 */
interface PCI{
    public void open();
    public void close();
}

//定義主板史侣,運(yùn)行的基礎(chǔ)
class MotherBoard{
    public void run(){
        System.out.println("主板運(yùn)行");
    }

    public void usePCI(PCI p)//接口型引用指向自己的子類對象
    {
        if(p != null)
        {
            p.open();
            p.close();
        }
    }
}


/**
 * 需要運(yùn)行部件實(shí)現(xiàn)方式
 */
class SoundCard implements PCI
{
    @Override
    public void open() {
        System.out.println("聲卡運(yùn)行");
    }

    @Override
    public void close() {
        System.out.println("聲卡關(guān)閉");
    }
}

2.設(shè)計(jì)模式

單例設(shè)計(jì)模式
  • 設(shè)計(jì)模式概念:解決某一類問題最行之有效的方法拴泌,可以重復(fù)利用。java有23種設(shè)計(jì)模式惊橱。
  • 單例模式:只對外提供一個實(shí)例蚪腐。在內(nèi)存中只存在一個對象。
  • 三要素:(1)在類體中需要具有靜態(tài)的私有的本類型的變量李皇、(2)構(gòu)造方法必須是私有的削茁,不允許實(shí)例化、(3)提供一個公共的靜態(tài)的入口方法掉房。
package com.sergio.lianxi;

/**
 * 單例模式餓漢式茧跋。
 * 第一種方式。類一進(jìn)內(nèi)存就建立對象卓囚。
 * Created by Sergio on 2014/10/10.
 */
public class SinglePattern {
    private int age;

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "SinglePattern{" +
            "age=" + age +
            '}';
    }

    //以下三個方法是單例使用的必須寫法
    /**
     * 靜態(tài)私有化本類的成員變量
     */
    private static SinglePattern instance = new SinglePattern();

    /**
     * 私有化構(gòu)造方法瘾杭,禁止對象實(shí)例化
     */
    private SinglePattern(){}

    /**
     * 對外提供一個公共的靜態(tài)入口方法
     */
    public static SinglePattern getInstance()
    {
        return instance;
    }
}

class SinglePatternTest
{
    public static void main(String[] args) {

        SinglePattern s1 = SinglePattern.getInstance();
        SinglePattern s2 = SinglePattern.getInstance();
        s1.setAge(23);
        System.out.println("s2 = " + s2);
    }
}
package com.sergio.lianxi;

/**
 * Created by Sergio on 2014/10/10.
 * 單例模式懶漢式。也叫延遲加載式哪亿。只有調(diào)用了getInstance方法時(shí)粥烁,才建立對象
 */
public class SinglePattern2 {
    private static SinglePattern2 instance = null;
    private SinglePattern2(){}
    public static synchronized SinglePattern2 getInstance()
    {
if
        if(instance == null)
        {
            instance = new SinglePattern2();
        }
        return instance;
    }
}

注意:開發(fā)時(shí)候使用餓漢式,也就是第一種蝇棉。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末讨阻,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子篡殷,更是在濱河造成了極大的恐慌钝吮,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件板辽,死亡現(xiàn)場離奇詭異奇瘦,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)劲弦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進(jìn)店門耳标,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人邑跪,你說我怎么就攤上這事次坡。” “怎么了画畅?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵砸琅,是天一觀的道長。 經(jīng)常有香客問我夜赵,道長,這世上最難降的妖魔是什么乡革? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任寇僧,我火速辦了婚禮摊腋,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘嘁傀。我一直安慰自己兴蒸,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布细办。 她就那樣靜靜地躺著橙凳,像睡著了一般。 火紅的嫁衣襯著肌膚如雪笑撞。 梳的紋絲不亂的頭發(fā)上岛啸,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天,我揣著相機(jī)與錄音茴肥,去河邊找鬼坚踩。 笑死,一個胖子當(dāng)著我的面吹牛瓤狐,可吹牛的內(nèi)容都是我干的瞬铸。 我是一名探鬼主播,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼础锐,長吁一口氣:“原來是場噩夢啊……” “哼嗓节!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起皆警,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤拦宣,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后耀怜,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體恢着,經(jīng)...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年财破,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了掰派。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,622評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡左痢,死狀恐怖靡羡,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情俊性,我是刑警寧澤略步,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站定页,受9級特大地震影響趟薄,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜典徊,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一杭煎、第九天 我趴在偏房一處隱蔽的房頂上張望恩够。 院中可真熱鬧,春花似錦羡铲、人聲如沸蜂桶。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽扑媚。三九已至,卻和暖如春雷恃,著一層夾襖步出監(jiān)牢的瞬間疆股,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工褂萧, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留押桃,地道東北人。 一個月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓导犹,卻偏偏與公主長得像唱凯,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子谎痢,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,490評論 2 348

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

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法磕昼,類相關(guān)的語法,內(nèi)部類的語法节猿,繼承相關(guān)的語法票从,異常的語法,線程的語...
    子非魚_t_閱讀 31,598評論 18 399
  • 一:java概述:1滨嘱,JDK:Java Development Kit峰鄙,java的開發(fā)和運(yùn)行環(huán)境,java的開發(fā)工...
    ZaneInTheSun閱讀 2,635評論 0 11
  • 1.import static是Java 5增加的功能,就是將Import類中的靜態(tài)方法太雨,可以作為本類的靜態(tài)方法來...
    XLsn0w閱讀 1,216評論 0 2
  • 面向?qū)ο笾饕槍γ嫦蜻^程吟榴。 面向過程的基本單元是函數(shù)。 什么是對象:EVERYTHING IS OBJECT(萬物...
    sinpi閱讀 1,046評論 0 4
  • 年齡增長、不健康的生活習(xí)慣和各種壓力锥咸,身體的柔軟度在如此重負(fù)下怎能不大打折扣狭瞎?生硬的另一半,無論是男是女搏予,對方都不...
    咸魚隊(duì)長閱讀 3,500評論 0 2