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 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.在写一个程序时,东西尽量分开写,不要挤在一起显得很凌乱没有头绪。

你可能感兴趣的:(java基础6&实战开发Day3/set、get方法和扑克牌实战/2020-04-28)