目录
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"中直接搜索你想要的快捷方式
- 其他方法同理,直接搜索使用就好了
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.在写一个程序时,东西尽量分开写,不要挤在一起显得很凌乱没有头绪。