Java 面向?qū)ο笕腴T

目標(biāo)讀者

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

權(quán)限修飾符

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

是否能訪問 同一文件 同一包 子類 不同類
public
protected
default(缺?。?/td>
private

舉例:

類:老師(Teacher)

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

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

Class(類)

語法規(guī)則:

// public class xxx
// xxx 自己給類取的名字
public class Teacher{
    
    // 成員變量
    String name;
    int age;
    
    // 構(gòu)造方法 --- 獲得對象的方法
    // 與類同名,無返回值
    // 在用該類實例化一個對象的時候需要被調(diào)用
    // 類默認(rèn)自帶無參構(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)可以進(jìn)行成員變量的賦值。

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

public class Teacher {

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

    // 構(gòu)造方法
    // 默認(rèn)自帶無參
    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)的語句,進(jìn)行賦值
        // 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

代表“當(dāng)前對象”示例

就可以區(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.如何保護(hù) name 不被隨意修改?

public class Teacher {

    // 成員變量
    private String name;
}

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

public class Teacher {

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

封裝

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

外部可以修改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)

看起來和之前的小餅干很重合!?。?/p>

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è)計模式

當(dāng)一個類需要初始化的成員變量比較多、比較復(fù)雜時,僅使用構(gòu)造方法來初始化對象就顯得冗余且難以理解,這里介紹一個經(jīng)典的解決辦法:利用 Builder 設(shè)計模式實現(xiàn)鏈?zhǔ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)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容