java基础6&实战开发Day3/set、get方法和扑克牌实战/2020-04-28

目录

1.Setter、Getter和toString方法
2.面向对象实现发牌项目

1.Setter、Getter和toString方法

a.Setter、Getter方法的作用:间接访问private修饰的成员变量
b.Setter、Getter方法什么时候使用:当外部需要使用这个属性,并且该属性是私有的时候;

例如我们先在Person类里面定义不同修饰符的属性,其中name和addr属于私有属性,money属于公共类,然后在主程序中运行。

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属性时使用了:p.setName,然后后面打印的时候使用到:p.getName。这就是我们的Setter和Getter方法。
  • 那么我们怎么使用Setter、Getter方法呢,下面就来展示一下吧
    public String getName() {
        return name;
    }

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

这里出现了一个我们没有见过的方法:this.name。先讲讲“this.”的使用方法和什么时候使用吧

  • 当出现歧义的时候,我们就要使用this方法来调用,例如上面已经出现name,但是在使用Setter方法时又出现了name,就算是出现了歧义,这时就要使用this来调用上面的name。
  • this方法可以调用属性和方法

于是便出现一个问题:总是手动输入Setter和Getter方法特别麻烦,那么有没有什么快捷方法能为我们快速添加Setter和Getter方法呢,下面就开看看吧
1.MacOS:Ctrl + enter 打开快捷栏,里面有Getter and Setter(选择要生成Getter和Setter的字段)/Constructor(快速提供构造方法)等快捷方式,也有单独的添加某一个Setter或Getter方法的快捷方式;
2.Windows:在导航栏的"Help"->"Find Action"中直接搜索你想要的快捷方式


导航栏->"Help"->"Find Action"

搜索Getter and Setter

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

1.建议setter/getter方法放在最后面(方便代码阅读)
2. 构造方法写在属性下面

c.toString方法

例如我们输出一个之前创建的对象p

System.out.println(p);

打印结果为:com.example.java.Day3.Person@42a57993

这是java的自动toString方法,如果你没有创建toString方法的话,系统会默认把你的输出的东西转化为字符串,这里显示的是p的地址
当你输入toString时,系统会进行提示并自动添加这一段toString方法

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

当我们添加完这段代码之后,再次打印p的时候会是什么样子呢

打印结果为:Person{name='jack', addr='null', money=200}
toString方法的实现方式和作用

1.当使用print输出一个对象时 就会去这个对象内部查找toStrong方法
2.如果没有实现name 那么会从父类Object里面去查找toString的实现
3.Object里面默认使用 类名@hashCode
4.重写toString方法是为了在调试的时候快速获取这个对象的信息

2.面向对象实现发牌项目

1.分析功能、抽取类:PokerManager和Poker
2.开始实现功能
a.Poker类,管理一张牌的信息(点数和花色/设置为私有属性)并提供构造方法、set和get方法(外部使用)和重写toString方法(便于调试)

public class Poker {
    private String dot; //记录点数
    private String pic; //记录花色

    //提供构造方法
    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方法(便于调试)
    @Override
    public String toString() {
        return dot + pic;
    }
}

b.Constants类,管理所有不变的东西(点数和花色)

public class Constants {
    //保存所有点数
    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的目的时在程序开始运行的时候就把这些已知的东西运行好,便于使用

final:修饰成员变量,表示这是一个常量,不能被更改,被修饰属性通常使用大写字母


c.PokerManager类,管理一副牌的所有操作(生成 洗牌 显示)
Step1.先给这副扑克牌定一个框架(即一个保存扑克牌的数组),并实现构造方法和初始化数组

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

    //实现构造方法
    public PokerManager(){
     //初始化数组
     pokers = new ArrayList<>();
    }

这里使用的不是一般的数组,而是List类型的数组,使用这个数组是为了后面shuffle类(洗牌)直接引用数组

Step2.生成一副牌:这次我们使用的遍历数组方法是需要考虑顺序的(上次的扑克牌Demo直接用增强for循环没有考虑顺序),我们直接用两个for循环吧点数和花色组合起来依次取出,然后创建一张组合好的扑克牌并保存,依次保存整副扑克牌

    //生成一副牌(扑克牌 麻将)
    public void generateOnePackOfCard(){
        for (int i = 0; i < Constants.POKRE_DOTS.length; i++) {
        //取出i对应的点数
            String dot = Constants.POKRE_DOTS[i];
            //为这个点数创建4种花色
            for (int j = 0; j < Constants.POKER_PICS.length; j++) {
                //取出j对应的花色
                String pic = Constants.POKER_PICS[j];
                //创建一张牌
                Poker poker = new Poker(dot,pic);
                //保存这张牌
                pokers.add(poker);
            }
        }
    }

Step3.洗牌操作:这没什么说的,系统直接提供的方法可以使用,方法对数组的要求是List类型

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

Step4.显示一副牌:这里不用考虑顺序的话,直接使用增强for循环进行遍历,逐个输出一副牌

    //显示一副牌
    public void show(){
        int index = 0;
        for (Poker poker : pokers){
            //使用print不自动换行
            System.out.print(poker);
            //使显示的时候每8张牌换一行
            if ((index + 1) % 8 == 0){
                System.out.println(" ");
            }
            index++;
        }
    }

d.MyClass类,主程序,直接调用其他类定义好的方法

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

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

总结

1.在定义属性和方法的时候权限尽量小一点,不要直接上来就public,如果外部有需要,设置一个“Getter and Setter”方法对属性或者方法进行调用就好了,或者实在有需要,可将修饰符改为其他比较适合的修饰符;
2.toString方法方便调试,return后面可以自由设定返回值,很方便,也可直接使用系统提供的返回值;
3.在写一个程序时,东西尽量分开写,不要挤在一起显得很凌乱没有头绪。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,941评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,397评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,345评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,851评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,868评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,688评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,414评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,319评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,775评论 1 315
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,945评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,096评论 1 350
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,789评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,437评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,993评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,107评论 1 271
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,308评论 3 372
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,037评论 2 355