Java面向?qū)ο笕筇匦裕悍庋b

1. 封裝思想

封裝是面向?qū)ο笕筇卣髦唬浜x有兩個(gè)(掌握思想):

  • 把對象的字段和方法存放在一個(gè)獨(dú)立的模塊中(類)

  • 信息隱藏,盡可能隱藏對象的數(shù)據(jù)和功能的實(shí)現(xiàn)細(xì)節(jié)

封裝的好處:

1语盈、保證數(shù)據(jù)的安全性砖织,防止調(diào)用者隨意修改數(shù)據(jù)

2狂鞋、提高組件的重用性躏结,把公用功能放到一個(gè)類中,誰需要該功能夸研,直接調(diào)用即可

沒有封裝帶來的困惑:

學(xué)生類:

public class Student{

    String name;

    int age;

    void say() {

        System.out.println("我是" + name + ",今年" + age + "歲");

    }

}

測試類:

public class StudentDemo {

    public static void main(String[] args) {

        Student s = new Student();

        s.name = "小明";

        s.age = -12;

        s.say();//我是小明,今年-12歲

    }

}

此時(shí)從代碼語法上來看邦蜜,是沒有任何問題的,但是從邏輯上來分析人的年齡怎么能是負(fù)數(shù)呢亥至?造成該問題的根本原因就是:可以隨意訪問對象中的字段悼沈。

那么問題來了,怎么才能限制不能隨意訪問字段數(shù)據(jù)呢姐扮?

此時(shí)絮供,就該歡迎訪問修飾符登場了!

1.1. 訪問修飾符(必須記撞杳簟)

車庫有一個(gè)車位壤靶,旁邊寫著”公共車位”,那么該車位就是公共的惊搏,誰都可以訪問它贮乳。如果我在車位旁邊寫上“私家車位”忧换,那么該車位就只能是我自己來訪問。外界(除我之外)都訪問不了向拆,像“公共”亚茬、“私有”這種限制外界訪問的標(biāo)記符號,就稱之為訪問修飾符浓恳。

訪問修飾符才写,決定了有沒有權(quán)限訪問某個(gè)資源。

封裝其實(shí)就是要讓有些類看不到另外一些類中定義的字段和方法奖蔓。Java提供了不同的訪問權(quán)限修飾符來限定類中的成員讓誰可以訪問到。

image.png
  • private:表示當(dāng)前類私有的讹堤,類訪問權(quán)限吆鹤,只能在本類中操作,離開本類之后就不能直接訪問

  • 不寫(缺手奘亍):表示當(dāng)前包私有疑务,包訪問權(quán)限,定義和調(diào)用只能在同一個(gè)包中梗醇,才能訪問

  • protected:表示子類訪問權(quán)限知允,同包中的可以訪問,即使不同包但是有繼承關(guān)系也可以訪問

  • public:表示公共的叙谨,可以在當(dāng)前項(xiàng)目中任何地方訪問

private修飾符演示:

image.png

缺省和public修飾符演示:

image.png

暫時(shí)記孜赂搿:把所有的字段使用private修飾,所有方法使用public修飾手负。

1.2. 封裝使用(了解)

使用private修飾了Student類中的字段涤垫,此時(shí)在測試類中訪問報(bào)錯(cuò)。

public class Student {

    private String name;

    private int age;

}

測試類:

public class StudentDemo {

    public static void main(String[] args) {

        Student s = new Student();

        s.name = "小明";//此行報(bào)錯(cuò)竟终,訪問權(quán)限不足

        s.age = -12;//此行報(bào)錯(cuò)蝠猬,訪問權(quán)限不足

    }

}

此時(shí)使用private修飾字段后,在測試類中不能再操作這些字段了统捶,此時(shí)怎么辦榆芦?我們可以使用JavaBean的規(guī)范來解決,其實(shí)也非常簡單喘鸟。

1.2.1. JavaBean規(guī)范(重點(diǎn)掌握)

JavaBean是一種某些符合條件的特殊類匆绣,但是必須遵循一定的規(guī)范:

  • 類必須使用public修飾

  • 必須保證有公共無參數(shù)構(gòu)造器,即使手動(dòng)提供了帶參數(shù)的構(gòu)造器什黑,也得手動(dòng)提供無參數(shù)構(gòu)造器

  • 字段使用private修飾犬绒,每個(gè)字段提供一對getter和setter方法

需求:針對名為name的字段名來舉例

getter方法:僅僅用于返回某一個(gè)字段的值

public String getName(){

    return   name;  //返回name字段存儲(chǔ)的值

}

如果操作的字段是boolean類型的,此時(shí)是is方法兑凿,把 getName 變成 isName凯力。

setter方法:僅僅用來給某一個(gè)字段設(shè)置值

public void setName(String  n){

    name = n;  //把傳過來的參數(shù)n的值,存儲(chǔ)到name字段中

}

注意:每一個(gè)字段都得使用private修飾茵瘾,并提供一對getter/setter方法。

Eclipse工具可以自動(dòng)生成標(biāo)準(zhǔn)的getter/setter咐鹤,前期必須手寫拗秘。

代碼如下:

public class Student {

    private String name;

    private int age;

    public String getName() {

        return name;

    }

    public void setName(String n) {

        name = n;

    }

    public int getAge() {

        return age;

    }

    public void setAge(int a) {

        if(a < 0) {

            System.out.println("非法的年齡");

            return;

        }

        age = a;

    }

}

測試類:

public class StudentDemo {

    public static void main(String[] args) {

        Student s = new Student();

        // 調(diào)用setter方法設(shè)置字段數(shù)據(jù)

        s.setName("小明");

        s.setAge(12);

        // 調(diào)用getter方法獲取字段數(shù)據(jù)

        String n = s.getName();

        int a = s.getAge();

        System.out.println(n + "," + a);

    }

}

1.2.2. this關(guān)鍵字(掌握)

之前說過,變量名稱或方法參數(shù)名稱祈惶,要見名知意雕旨,下列兩個(gè)set方法的參數(shù)名,就顯得太LOW了捧请。

public class Student {

    private String name;

    private int age;

    public void setName(**String n**) {

        name = name;

    }

    public void setAge(**int a**) {

        age = age;

    }

    public String getName() {

        return name;

    }

    public int getAge() {

        return age;

    }

}

不就是設(shè)置名字和年齡嗎凡涩,如果此時(shí)把參數(shù)名分別改為name和age。

public class Student {

    private String name;

    private int age;

    public void setName(String **name**) {

        name = name;

    }

    public void setAge(int **age**) {

        age = age;

    }

    public String getName() {

        return name;

    }

    public int getAge() {

        return age;

    }

}

此時(shí)會(huì)發(fā)現(xiàn)參數(shù)根本就設(shè)置不進(jìn)去疹蛉,name和age打印出來都是各自的初始值活箕,運(yùn)行測試類的結(jié)果如下:

null,0

先回憶方法的參數(shù)屬于局部變量這個(gè)結(jié)論,導(dǎo)致參數(shù)設(shè)置不進(jìn)去的原因是:

局部變量和成員變量同名可款,此時(shí)在方法中調(diào)用變量時(shí)根據(jù)就近原則育韩,優(yōu)先使用局部變量,示意圖如下闺鲸。

image.png

可以看出setName方法中兩次使用的name筋讨,都是直接尋找距離自己最近的形參name,就相當(dāng)于把參數(shù)name的值設(shè)置給參數(shù)name摸恍,根本就沒有把參數(shù)值設(shè)置給成員變量悉罕。

該問題,更專業(yè)的叫法是局部變量和成員變量存在二義性立镶,也就是變量名有歧義蛮粮。為了解決該問題——有請this關(guān)鍵字。

使用this.變量名的語法谜慌,此時(shí)訪問的就是成員變量然想,this的其他操作,后面再講欣范。

image.png

具體代碼如下:

public class Student {

    private String name;

    private int age;

    public void setName(String name) {

        this.name = name;

    }

    public void setAge(int age) {

        this.age = age;

    }

    public String getName() {

        return name;

    }

    public int getAge() {

        return age;

    }

}

1.2.3. 使用構(gòu)造器還是setter方法(了解)

構(gòu)造器和setter方法都可以給對象設(shè)置數(shù)據(jù):

  • 構(gòu)造器变泄,在創(chuàng)建對象的時(shí)候設(shè)置初始數(shù)據(jù),只能初始化一次恼琼。

  • setter方法妨蛹,創(chuàng)建對象后再設(shè)置初始數(shù)據(jù),可以設(shè)置多次晴竞。

若要獲得最好的學(xué)習(xí)效果蛙卤,需要配合對應(yīng)教學(xué)視頻一起學(xué)習(xí)。需要完整教學(xué)視頻,請參看https://ke.qq.com/course/272077颤难。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末神年,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子行嗤,更是在濱河造成了極大的恐慌已日,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,183評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件栅屏,死亡現(xiàn)場離奇詭異飘千,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)栈雳,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評論 3 399
  • 文/潘曉璐 我一進(jìn)店門护奈,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人哥纫,你說我怎么就攤上這事霉旗。” “怎么了磺箕?”我有些...
    開封第一講書人閱讀 168,766評論 0 361
  • 文/不壞的土叔 我叫張陵,是天一觀的道長抛虫。 經(jīng)常有香客問我松靡,道長,這世上最難降的妖魔是什么建椰? 我笑而不...
    開封第一講書人閱讀 59,854評論 1 299
  • 正文 為了忘掉前任雕欺,我火速辦了婚禮,結(jié)果婚禮上棉姐,老公的妹妹穿的比我還像新娘屠列。我一直安慰自己,他們只是感情好伞矩,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,871評論 6 398
  • 文/花漫 我一把揭開白布笛洛。 她就那樣靜靜地躺著,像睡著了一般乃坤。 火紅的嫁衣襯著肌膚如雪苛让。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,457評論 1 311
  • 那天湿诊,我揣著相機(jī)與錄音狱杰,去河邊找鬼。 笑死厅须,一個(gè)胖子當(dāng)著我的面吹牛仿畸,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 40,999評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼错沽,長吁一口氣:“原來是場噩夢啊……” “哼簿晓!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起甥捺,我...
    開封第一講書人閱讀 39,914評論 0 277
  • 序言:老撾萬榮一對情侶失蹤抢蚀,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后镰禾,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體皿曲,經(jīng)...
    沈念sama閱讀 46,465評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,543評論 3 342
  • 正文 我和宋清朗相戀三年吴侦,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了屋休。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,675評論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡备韧,死狀恐怖劫樟,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情织堂,我是刑警寧澤叠艳,帶...
    沈念sama閱讀 36,354評論 5 351
  • 正文 年R本政府宣布易阳,位于F島的核電站附较,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏潦俺。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,029評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望卢鹦。 院中可真熱鬧,春花似錦劝堪、人聲如沸法挨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽凡纳。三九已至,卻和暖如春帝蒿,著一層夾襖步出監(jiān)牢的瞬間荐糜,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留暴氏,地道東北人延塑。 一個(gè)月前我還...
    沈念sama閱讀 49,091評論 3 378
  • 正文 我出身青樓,卻偏偏與公主長得像答渔,于是被迫代替她去往敵國和親关带。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,685評論 2 360

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

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對...
    cosWriter閱讀 11,113評論 1 32
  • 昨天下班后去廣州圖書館還書,想著還要借幾本書回來看务豺。已經(jīng)過了30歲的我磨总,有了家庭和孩子,現(xiàn)在趁孩子大了些笼沥,我開始上...
    敏敏Linda_1bf6閱讀 1,426評論 1 2
  • 韓道國(韓希堯)那天在和人吹牛蚪燕,說自己是掌管西門大官人所有生意的總管,和西門慶是如何熟稔奔浅,對方是如何看重自己馆纳,每晚...
    林蔚安閱讀 251評論 0 0
  • 自己在中專的幾年,依舊是堅(jiān)持許多汹桦。卻終是無成鲁驶。 學(xué)英語考慮到自己的以后,每天都在圖書館营勤,總是看書灵嫌,總是借各種書壹罚,那...
    宋世巍閱讀 139評論 0 0