java基礎(chǔ)6&實(shí)戰(zhàn)開發(fā)Day3/set、get方法和撲克牌實(shí)戰(zhàn)/2020-04-28

目錄

1.Setter、Getter和toString方法
2.面向?qū)ο髮?shí)現(xiàn)發(fā)牌項(xiàng)目

1.Setter、Getter和toString方法

a.Setter、Getter方法的作用:間接訪問private修飾的成員變量
b.Setter、Getter方法什么時(shí)候使用:當(dāng)外部需要使用這個(gè)屬性,并且該屬性是私有的時(shí)候;

例如我們先在Person類里面定義不同修飾符的屬性,其中name和addr屬于私有屬性,money屬于公共類,然后在主程序中運(yùn)行。

public class Person {
    private String name;
    private  String addr;
    public int money;
}

public class MyClass {
    public static void main(String[] args) {
        Person p = new Person();

        //直接訪問
        p.money = 200;

        //間接訪問
        p.setName("jack");

        System.out.println("I have " + p.money + " money");
        System.out.println("My name is " + p.getName());
        }
}
  • 我們很明顯能知道:name和addr是不能直接使用的,但是我們在主程序中使用name屬性時(shí)使用了:p.setName,然后后面打印的時(shí)候使用到:p.getName。這就是我們的Setter和Getter方法。
  • 那么我們怎么使用Setter、Getter方法呢,下面就來展示一下吧
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

這里出現(xiàn)了一個(gè)我們沒有見過的方法:this.name。先講講“this.”的使用方法和什么時(shí)候使用吧

  • 當(dāng)出現(xiàn)歧義的時(shí)候,我們就要使用this方法來調(diào)用,例如上面已經(jīng)出現(xiàn)name,但是在使用Setter方法時(shí)又出現(xiàn)了name,就算是出現(xiàn)了歧義,這時(shí)就要使用this來調(diào)用上面的name。
  • this方法可以調(diào)用屬性和方法

于是便出現(xiàn)一個(gè)問題:總是手動輸入Setter和Getter方法特別麻煩,那么有沒有什么快捷方法能為我們快速添加Setter和Getter方法呢,下面就開看看吧
1.MacOS:Ctrl + enter 打開快捷欄,里面有Getter and Setter(選擇要生成Getter和Setter的字段)/Constructor(快速提供構(gòu)造方法)等快捷方式,也有單獨(dú)的添加某一個(gè)Setter或Getter方法的快捷方式;
2.Windows:在導(dǎo)航欄的"Help"->"Find Action"中直接搜索你想要的快捷方式


導(dǎo)航欄->"Help"->"Find Action"

搜索Getter and Setter

添加Getter and Setter方法界面
  • 其他方法同理,直接搜索使用就好了

1.建議setter/getter方法放在最后面(方便代碼閱讀)
2. 構(gòu)造方法寫在屬性下面

c.toString方法

例如我們輸出一個(gè)之前創(chuàng)建的對象p

System.out.println(p);

打印結(jié)果為:com.example.java.Day3.Person@42a57993

這是java的自動toString方法,如果你沒有創(chuàng)建toString方法的話,系統(tǒng)會默認(rèn)把你的輸出的東西轉(zhuǎn)化為字符串,這里顯示的是p的地址
當(dāng)你輸入toString時(shí),系統(tǒng)會進(jìn)行提示并自動添加這一段toString方法

@Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", addr='" + addr + '\'' +
                ", money=" + money +
                '}';

當(dāng)我們添加完這段代碼之后,再次打印p的時(shí)候會是什么樣子呢

打印結(jié)果為:Person{name='jack', addr='null', money=200}
toString方法的實(shí)現(xiàn)方式和作用

1.當(dāng)使用print輸出一個(gè)對象時(shí) 就會去這個(gè)對象內(nèi)部查找toStrong方法
2.如果沒有實(shí)現(xiàn)name 那么會從父類Object里面去查找toString的實(shí)現(xiàn)
3.Object里面默認(rèn)使用 類名@hashCode
4.重寫toString方法是為了在調(diào)試的時(shí)候快速獲取這個(gè)對象的信息

2.面向?qū)ο髮?shí)現(xiàn)發(fā)牌項(xiàng)目

1.分析功能、抽取類:PokerManager和Poker
2.開始實(shí)現(xiàn)功能
a.Poker類,管理一張牌的信息(點(diǎn)數(shù)和花色/設(shè)置為私有屬性)并提供構(gòu)造方法、set和get方法(外部使用)和重寫toString方法(便于調(diào)試)

public class Poker {
    private String dot; //記錄點(diǎn)數(shù)
    private String pic; //記錄花色

    //提供構(gòu)造方法
    public Poker(String dot, String pic) {
        this.dot = dot;
        this.pic = pic;
    }

    //set和get方法(外部使用)
    public String getDot() {
        return dot;
    }

    public void setDot(String dot) {
        this.dot = dot;
    }

    public String getPic() {
        return pic;
    }

    public void setPic(String pic) {
        this.pic = pic;
    }

    //重寫toString方法(便于調(diào)試)
    @Override
    public String toString() {
        return dot + pic;
    }
}

b.Constants類,管理所有不變的東西(點(diǎn)數(shù)和花色)

public class Constants {
    //保存所有點(diǎn)數(shù)
    public static final String[] POKRE_DOTS = new String[]{
            "2","3","4","5","6",
            "7","8","9","10","J",
            "Q","K","A"
    };

    //保存所有的花色
    public static final String[] POKER_PICS = new String[]{"","","",""};
}

這里使用static的目的時(shí)在程序開始運(yùn)行的時(shí)候就把這些已知的東西運(yùn)行好,便于使用

final:修飾成員變量,表示這是一個(gè)常量,不能被更改,被修飾屬性通常使用大寫字母


c.PokerManager類,管理一副牌的所有操作(生成 洗牌 顯示)
Step1.先給這副撲克牌定一個(gè)框架(即一個(gè)保存撲克牌的數(shù)組),并實(shí)現(xiàn)構(gòu)造方法和初始化數(shù)組

    //保存一副牌
    private ArrayList<Poker> pokers;

    //實(shí)現(xiàn)構(gòu)造方法
    public PokerManager(){
     //初始化數(shù)組
     pokers = new ArrayList<>();
    }

這里使用的不是一般的數(shù)組,而是List類型的數(shù)組,使用這個(gè)數(shù)組是為了后面shuffle類(洗牌)直接引用數(shù)組

Step2.生成一副牌:這次我們使用的遍歷數(shù)組方法是需要考慮順序的(上次的撲克牌Demo直接用增強(qiáng)for循環(huán)沒有考慮順序),我們直接用兩個(gè)for循環(huán)吧點(diǎn)數(shù)和花色組合起來依次取出,然后創(chuàng)建一張組合好的撲克牌并保存,依次保存整副撲克牌

    //生成一副牌(撲克牌 麻將)
    public void generateOnePackOfCard(){
        for (int i = 0; i < Constants.POKRE_DOTS.length; i++) {
        //取出i對應(yīng)的點(diǎn)數(shù)
            String dot = Constants.POKRE_DOTS[i];
            //為這個(gè)點(diǎn)數(shù)創(chuàng)建4種花色
            for (int j = 0; j < Constants.POKER_PICS.length; j++) {
                //取出j對應(yīng)的花色
                String pic = Constants.POKER_PICS[j];
                //創(chuàng)建一張牌
                Poker poker = new Poker(dot,pic);
                //保存這張牌
                pokers.add(poker);
            }
        }
    }

Step3.洗牌操作:這沒什么說的,系統(tǒng)直接提供的方法可以使用,方法對數(shù)組的要求是List類型

    //洗牌
    public void shuffle(){
        // 1 2 3 4 5
        Collections.shuffle(pokers);
    }

Step4.顯示一副牌:這里不用考慮順序的話,直接使用增強(qiáng)for循環(huán)進(jìn)行遍歷,逐個(gè)輸出一副牌

    //顯示一副牌
    public void show(){
        int index = 0;
        for (Poker poker : pokers){
            //使用print不自動換行
            System.out.print(poker);
            //使顯示的時(shí)候每8張牌換一行
            if ((index + 1) % 8 == 0){
                System.out.println(" ");
            }
            index++;
        }
    }

d.MyClass類,主程序,直接調(diào)用其他類定義好的方法

public class MyClass {
    public static void main(String[] args) {
        //創(chuàng)建管理器manager
        PokerManager manager = new PokerManager();
        //生成一副牌
        manager.generateOnePackOfCard();
        //洗牌
        manager.shuffle();
        //顯示
        manager.show();
    }
}

某次洗牌后的一副牌:
7810691053 
582AQ846 
8394952J 
JQK1063QK 
344KQ96A 
AK2J7A72 
J1057

總結(jié)

1.在定義屬性和方法的時(shí)候權(quán)限盡量小一點(diǎn),不要直接上來就public,如果外部有需要,設(shè)置一個(gè)“Getter and Setter”方法對屬性或者方法進(jìn)行調(diào)用就好了,或者實(shí)在有需要,可將修飾符改為其他比較適合的修飾符;
2.toString方法方便調(diào)試,return后面可以自由設(shè)定返回值,很方便,也可直接使用系統(tǒng)提供的返回值;
3.在寫一個(gè)程序時(shí),東西盡量分開寫,不要擠在一起顯得很凌亂沒有頭緒。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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