Java 面向?qū)ο笕腴T

目標讀者

了解 Java 基本數(shù)據(jù)類型
掌握 Java 輸出渤刃、for、if 等基本語法
熟練應(yīng)用函數(shù)贴膘,了解函數(shù)重載等基本知識
熟練使用 IntelliJ IDEA

權(quán)限修飾符

類卖子、成員變量、成員方法最前面的單詞叫做權(quán)限修飾符刑峡,表明從項目的哪些地方可以訪問這個類洋闽、變量、方法突梦。具體見下表:

是否能訪問 同一文件 同一包 子類 不同類
public
protected
default(缺式刖恕)
private

舉例:

類:老師(Teacher)

特征:成員變量:有姓名(name),年齡(age)等屬性

行為:成員方法:講課(teaching)宫患、布置作業(yè)(assignWork)

Class(類)

語法規(guī)則:

// public class xxx
// xxx 自己給類取的名字
public class Teacher{
    
    // 成員變量
    String name;
    int age;
    
    // 構(gòu)造方法 --- 獲得對象的方法
    // 與類同名刊懈,無返回值
    // 在用該類實例化一個對象的時候需要被調(diào)用
    // 類默認自帶無參構(gòu)造函數(shù)
    Teacher(){
        
    }
    
    // 有參構(gòu)造函數(shù)
    // 一般是為成員變量賦值
    Teacher(String name){
        ......
    }
    
    // 普通成員方法
    private void teaching(){
        ......
    }
    
    void assignWork(){
        ......
    }
}

思考:

1.teaching是否可以獲得值 name 或者 age?

根據(jù)變量的作用域可知娃闲,是可以的虚汛。

舉例:

有一個老師,她叫twter皇帮,年齡是18歲

有一個老師卷哩,她叫冠中,年齡是5歲

有一個老師属拾,她叫昕姐将谊,年齡是3歲

對象

對象是描述客觀事物的一個實體,由類實例化來生成渐白。

普通的成員變量和成員方法都是屬于這個對象的尊浓。

即這個對象誕生,屬于這個對象的成員變量和成員方法才誕生礼预。

要通過對象才能獲得成員變量和成員方法眠砾。

構(gòu)造方法

構(gòu)造方法是類與對象的橋梁,構(gòu)造方法和類同名托酸,且沒有返回值褒颈。

在構(gòu)造方法內(nèi)可以進行成員變量的賦值。

通過new調(diào)用構(gòu)造方法可以獲得類的實例化對象励堡。

public class Teacher {

    // 成員變量
    String name;
    int age;

    // 構(gòu)造方法
    // 默認自帶無參
    Teacher() {

    }
    
    Teacher(String mname,int mage){
        name = mname;
        age = mage;
    }
}

public class Test {
    public static void main(String[] args) {
        // 通過new可以生成一個新的具體的類
        // 我們稱之為實例化 Teacher 生成一個 Teacher 的對象
        Teacher teacher = new Teacher();
        Teacher teacher1 = new Teacher();
        // teacher 和 teacher1 不是同一個對象
        teacher.name = "twter";
        teacher.age = 18;
        
        // 執(zhí)行構(gòu)造函數(shù)內(nèi)的語句谷丸,進行賦值
        // Teacher的實例化對象 teacher3
        // teacher3的name是twter,age是18
        Teacher teacher2 = new Teacher("twter", 18);
        Teacher teacher3 = new Teacher("greenTea", 12);
    }
}

思考:

1.如何獲得一個老師应结,她叫綠茶刨疼,年齡是12歲泉唁。

2.有參構(gòu)造函數(shù)可以寫成如下形式嗎?

public class Teacher {

    // 成員變量
    String name;
    int age;
    
    Teacher(String name,int age){
        name = name;
        age = age;
    }
}

this

代表“當前對象”示例

就可以區(qū)別傳入的參數(shù)“name”和對象自己的“name”揩慕。

public class Teacher {

    // 成員變量
    String name;
    int age;
    
    Teacher(String name,int age){
        this.name = name;
        this.age = age;
    }
}

舉例:

某個老師上課(teaching)的時候會說 name 老師在上課

成員方法

public class Teacher {

    // 成員變量
    String name;
    int age;
    
    Teacher(String name){
        this.name = name;
    }
    
    Teacher(String name, int age) {
        this.name = name;
        this.age = age;
    }

    // 普通成員方法
    void teaching() {
        System.out.println(name + "is teaching");
    }
}


public class Test {
    public static void main(String[] args) {
        Teacher teacher2 = new Teacher("twter", 18);
        Teacher teacher3 = new Teacher("sxbasubx");
        
        teacher2.teaching();
    }
}

思考:

1.某個老師布置作業(yè)(assingWork)的時候會說老師布置了 x 道作業(yè)

public class Teacher {

    // 成員變量
    String name;
    int age;

    Teacher(String name, int age) {
        this.name = name;
        this.age = age;
    }
    
    void assignWork(int x) {
        System.out.println(name + " assign " + x + " number of homework");
    }
}

public class Test {
    public static void main(String[] args) {
        Teacher teacher2 = new Teacher("twter", 18);
        teacher2.assignWork(2);
    }
}

2.如何保護 name 不被隨意修改亭畜?

public class Teacher {

    // 成員變量
    private String name;
}

但是我在main函數(shù)里想要獲得老師對象的 name?

public class Teacher {

    // 成員變量
    private String name;
    
    public String getName() {
        return name;
    }
}

封裝

要訪問該類的代碼和數(shù)據(jù)迎卤,必須通過嚴格的接口控制拴鸵。

外部可以修改name,比如在main函數(shù)里可以修改name蜗搔,但是必須按照規(guī)定的方式來劲藐。

public class Teacher {

    // 成員變量
    private String name;
    
    public String getName() {
        return name;
    }
    
    public void setName(String name) {
        this.name = name;
    }
}

疑惑:那這和我直接用 public 修飾 name 變量有什么區(qū)別吶?

課堂作業(yè)

類:小餅干(cookie)

這個小餅干是由巧克力和抹茶組成的樟凄!

成員變量:價格(price)聘芜,小餅干中巧克力的價格(priceOfChocolate),小餅干中抹茶的價格(priceOfTea)

price = priceOfChocolate + priceOfTea

我想要在main函數(shù)里實例化3個不同價格的巧克力和不同價格抹茶的組成的小餅干對象缝龄。

Coockie priceOfChocolate priceOfTea
coockie1 12.4 121
coockie2 13 423
Coockie3 12937 1213.2

根據(jù) price 理解封裝的好處汰现。

想要統(tǒng)計生成的餅干數(shù)量?

這個信息應(yīng)該是凌駕于對象上的

static

用static修飾的成員變量和成員方法不再依賴于對象叔壤,而是屬于類本身服鹅。可以直接通過類名獲得

1.靜態(tài)方法里可以使用靜態(tài)成員變量嗎百新?

2.普通(非靜態(tài))方法里可以使用靜態(tài)成員變量嗎?

3.普通方法里可以使用普通成員變量嗎庐扫?

4.靜態(tài)方法里可以使用普通成員變量嗎饭望?

5.普通方法里可以調(diào)用靜態(tài)方法嗎?

6.靜態(tài)方法里可以調(diào)用靜態(tài)方法嗎形庭?

7.靜態(tài)方法里可以調(diào)用普通方法嗎铅辞?

yes yes yes no yes yes no

package xyz.chenshuyusc.course2;

public class Coockie {
    private double price;
    private double priceOfChocolate;
    private double priceOfTea;

    private static int count; // = 0

    public Coockie() {
        ++count;
    }

    public Coockie(double priceOfsth, boolean isTea) {
        if (isTea) {
            this.priceOfTea = priceOfsth;
        } else {
            this.priceOfChocolate = priceOfsth;
        }
        this.price = this.priceOfTea;
        ++count;
    }

    public Coockie(double priceOfTea){
        this.priceOfTea = priceOfTea;
        this.price = this.priceOfTea;
    }

    public double getPrice() {
        return price;
    }

    public double getPriceOfChocolate() {
        return priceOfChocolate;
    }

    public double getPriceOfTea() {
        return priceOfTea;
    }


    public void setPriceOfChocolate(double priceOfChocolate) {
        this.priceOfChocolate = priceOfChocolate;
        this.price = this.priceOfChocolate + this.priceOfTea;
    }

    public void setPriceOfTea(double priceOfTea) {
        this.priceOfTea = priceOfTea;
        this.price = this.priceOfChocolate + this.priceOfTea;
    }

    public static int getCount() {
        return count;
    }

    protected void setPrice(double price) {
        this.price = price;
    }
}

舉例子:

類:甜甜的小餅干

這個小餅干是由巧克力和抹茶組成的甜味小餅干!

成員變量:價格(price)萨醒,小餅干中巧克力的價格(priceOfChocolate)斟珊,小餅干中抹茶的巧克(priceOfTea),糖(priceOfSugar)

類:咸咸的小餅干

這個小餅干是由巧克力和抹茶組成的咸味小餅干富纸!

成員變量:價格(price)囤踩,小餅干中巧克力的價格(priceOfChocolate),小餅干中抹茶的巧克(priceOfTea)晓褪,鹽(priceOfYan)

看起來和之前的小餅干很重合6率!涣仿!

extends ( 繼承 )

子類繼承父類的特征和行為勤庐。

即甜甜的小餅干繼承小餅干示惊,就獲得了小餅干中非private的成員變量和成員方法。

但甜甜的小餅干又比小餅干多了priceOfSugar愉镰。

public class Coockie {
    private double price;
    private double priceOfChocolate;
    private double priceOfTea;

    public Coockie() {
    }

    public Coockie(double priceOfsth, boolean isTea) {
        if (isTea) {
            this.priceOfTea = priceOfsth;
        } else {
            this.priceOfChocolate = priceOfsth;
        }
        this.price = this.priceOfTea;
    }

    public double getPrice() {
        return price;
    }

    public double getPriceOfChocolate() {
        return priceOfChocolate;
    }

    public double getPriceOfTea() {
        return priceOfTea;
    }


    public void setPriceOfChocolate(double priceOfChocolate) {
        this.priceOfChocolate = priceOfChocolate;
        this.price = this.priceOfChocolate + this.priceOfTea;
    }

    public void setPriceOfTea(double priceOfTea) {
        this.priceOfTea = priceOfTea;
        this.price = this.priceOfChocolate + this.priceOfTea;
    }

    protected void setPrice(double price) {
        this.price = price;
    }
}


public class SugarCoockie extends Coockie {
    private double priceOfSugar;

    public SugarCoockie(double priceOfsth, boolean isTea) {
        super(priceOfsth,isTea);
    }
    
    public double getPriceOfSugar() {
        return priceOfSugar;
    }

    public void setPriceOfSugar(double priceOfSugar) {
        setPrice(getPrice() - this.priceOfSugar + priceOfSugar);
        this.priceOfSugar = priceOfSugar;
    }
}

子類的構(gòu)造方法必須調(diào)用父類的構(gòu)造方法米罚。

思考:如果要通過子類實例化對象,父類可以沒有構(gòu)造函數(shù)嗎丈探?

Override

子類中包含跟父類方法簽名一樣的方法录择,父類的方法會被覆蓋掉,我們就說該方法被重寫类嗤。如需調(diào)用父類原有的成員方法糊肠,可使用 super 關(guān)鍵字。

public class Coockie {
    protected double price;
    protected double priceOfChocolate;
    protected double priceOfTea;

    public Coockie() {
    }

    public Coockie(double priceOfsth, boolean isTea) {
        if (isTea) {
            this.priceOfTea = priceOfsth;
        } else {
            this.priceOfChocolate = priceOfsth;
        }
        this.price = this.priceOfTea;
    }

    public double getPrice() {
        return price;
    }

    public double getPriceOfChocolate() {
        return priceOfChocolate;
    }

    public double getPriceOfTea() {
        return priceOfTea;
    }


    public void setPriceOfChocolate(double priceOfChocolate) {
        this.priceOfChocolate = priceOfChocolate;
        this.price = this.priceOfChocolate + this.priceOfTea;
    }

    public void setPriceOfTea(double priceOfTea) {
        this.priceOfTea = priceOfTea;
        this.price = this.priceOfChocolate + this.priceOfTea;
    }

    public static int getCount() {
        return count;
    }

    protected void setPrice(double price) {
        this.price = price;
    }
}


public class SugarCoockie extends Coockie {
    private double priceOfSugar;

    @Override
    public void setPriceOfChocolate(double priceOfChocolate) {
        this.priceOfChocolate = priceOfChocolate;
        this.price = this.priceOfSugar + this.priceOfChocolate + this.priceOfTea;
    }

    @Override
    public void setPriceOfTea(double priceOfTea) {
        super.setPriceOfTea(priceOfTea);
        this.price = this.priceOfSugar + this.priceOfChocolate + this.priceOfTea;
    }

    public double getPriceOfSugar() {
        return priceOfSugar;
    }

    public void setPriceOfSugar(double priceOfSugar) {
        this.priceOfSugar = priceOfSugar;
        this.price = this.priceOfSugar + this.priceOfChocolate + this.priceOfTea;
    }

}

Builder 設(shè)計模式

當一個類需要初始化的成員變量比較多遗锣、比較復雜時货裹,僅使用構(gòu)造方法來初始化對象就顯得冗余且難以理解,這里介紹一個經(jīng)典的解決辦法:利用 Builder 設(shè)計模式實現(xiàn)鏈式調(diào)用來獲取對象精偿。

package xyz.chenshuyusc.course2;

public class Coockie {
    double price;
    double priceOfChocolate;
    double priceOfTea;
    Choc choc = new Choc();

    public Coockie() {
    }

    public Coockie(double priceOfChocolate, double priceOfTea,Choc choc) {
        this.choc = choc;
        this.priceOfTea = priceOfTea;
        this.priceOfChocolate = priceOfChocolate;
        this.price = this.priceOfTea + this.priceOfChocolate;
    }
    
    public double getPrice() {
        return price;
    }

    public double getPriceOfChocolate() {
        return priceOfChocolate;
    }

    public double getPriceOfTea() {
        return priceOfTea;
    }


    public void setPriceOfChocolate(double priceOfChocolate) {
        choc.price = priceOfChocolate;
        this.priceOfChocolate = priceOfChocolate;
        this.price = this.priceOfChocolate + this.priceOfTea;
    }

    public void setPriceOfTea(double priceOfTea) {
        this.priceOfTea = priceOfTea;
        this.price = this.priceOfChocolate + this.priceOfTea;
    }

}

public class CoockieBuilder {

    private Coockie coockie = new Coockie();

    public CoockieBuilder priceOfTea(double priceOfTea) {
        coockie.setPriceOfTea(priceOfTea);
        return this;
    }

    public CoockieBuilder priceOfChocolate(double priceOfChocolate) {
        coockie.setPriceOfChocolate(priceOfChocolate);
        return this;
    }
}

package xyz.chenshuyusc.course2;

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

        Coockie coockie = new CoockieBuilder()
                .priceOfChocolate(1213)
                .priceOfTea(1293)
                .build();

        CoockieBuilder coockieBuilder = new CoockieBuilder();
        coockieBuilder = coockieBuilder.priceOfTea(1231.2);
        coockieBuilder = coockieBuilder.priceOfChocolate(21);
        coockieBuilder = coockieBuilder.priceOfTea(213);


        System.out.println(coockie.getPriceOfChocolate());
        System.out.println(coockie.getPriceOfTea());
        System.out.println(coockie.getPrice());
    }
}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末弧圆,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子笔咽,更是在濱河造成了極大的恐慌搔预,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,657評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件叶组,死亡現(xiàn)場離奇詭異拯田,居然都是意外死亡,警方通過查閱死者的電腦和手機甩十,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評論 3 394
  • 文/潘曉璐 我一進店門船庇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人侣监,你說我怎么就攤上這事鸭轮。” “怎么了橄霉?”我有些...
    開封第一講書人閱讀 164,057評論 0 354
  • 文/不壞的土叔 我叫張陵窃爷,是天一觀的道長。 經(jīng)常有香客問我姓蜂,道長按厘,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,509評論 1 293
  • 正文 為了忘掉前任覆糟,我火速辦了婚禮刻剥,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘滩字。我一直安慰自己造虏,他們只是感情好御吞,可當我...
    茶點故事閱讀 67,562評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著漓藕,像睡著了一般陶珠。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上享钞,一...
    開封第一講書人閱讀 51,443評論 1 302
  • 那天揍诽,我揣著相機與錄音,去河邊找鬼栗竖。 笑死暑脆,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的狐肢。 我是一名探鬼主播添吗,決...
    沈念sama閱讀 40,251評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼份名!你這毒婦竟也來了碟联?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,129評論 0 276
  • 序言:老撾萬榮一對情侶失蹤僵腺,失蹤者是張志新(化名)和其女友劉穎鲤孵,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體辰如,經(jīng)...
    沈念sama閱讀 45,561評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡普监,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,779評論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了琉兜。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鹰椒。...
    茶點故事閱讀 39,902評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖呕童,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情淆珊,我是刑警寧澤夺饲,帶...
    沈念sama閱讀 35,621評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站施符,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜奈应,卻給世界環(huán)境...
    茶點故事閱讀 41,220評論 3 328
  • 文/蒙蒙 一痒留、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧听哭,春花似錦慢洋、人聲如沸塘雳。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽败明。三九已至,卻和暖如春太防,著一層夾襖步出監(jiān)牢的瞬間妻顶,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評論 1 269
  • 我被黑心中介騙來泰國打工蜒车, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留讳嘱,地道東北人。 一個月前我還...
    沈念sama閱讀 48,025評論 2 370
  • 正文 我出身青樓酿愧,卻偏偏與公主長得像沥潭,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子寓娩,可洞房花燭夜當晚...
    茶點故事閱讀 44,843評論 2 354