2020.3.22
学习目的:掌握setter、getter、toString方法,并完成生成一副扑克牌项目,巩固基础
一.准备工作->数组的定义、foreach循环、setter和getter、toString
1.数组的定义
int num[]=new int[30];数组也是对象,需要使用new关键字创建
length->数组的静态属性,使用数组名调用可获取数组的长度,如int length=num.length;
另外一种创建数组的方式:String name[]=new String[]{"jack","rose","xw"};该数组称为静态数组
注:常用创建数组的形式->String[] name=new String[5]; 前后更对称一些
2.foreach循环
foreach循环也称增强for循环,它不关心循环变量i,只需要从给定的数组中取出元素
格式:for(数组中元素的类型 temp:数组名);
temp->临时变量,每一次循环的temp是对应的数组元素,第一次对应第一个,第二次对应第二个,以此类推,直到数组中的元素被取完便退出for循环
使用foreach循环很方便,只要不关心当前元素是第几个便可便捷使用
3.setter和getter方法
为什么需要setter和getter方法:很多时候,成员变量需要使用private修饰,此时在其他类中无法访问这些私有的成员变量,而setter和getter方法便可间接访问
setter:给成员变量赋值 getter:获取成员变量的值
私有的成员变量不能直接通过打点.的方式来调用,只能通过setter、getter方法访问,所以称为间接,这两个方法就好像是为私有成员变量提供给外部了一个通道,可供外部使用
为了提高阅读性,最好将setter、getter方法写在最后
package day3;
public class Person {
public String name;
private int pocket_money;
//获取零花钱的金额
public int getPocket_money() {
return pocket_money;
}
//设置零花钱的金额
public void setPocket_money(int pocket_money) {
this.pocket_money = pocket_money;
}
public String toString() {
return "重写toString方法";
}
}
--------------------------------------------------------------------------------------------------
package day3;
public class Myclass {
public static void main(String[] args) {
Person p=new Person();
p.name="xiaowang";
p.setPocket_money(10);//间接设置money的值
int quantity=p.getPocket_money();//间接获取money的值
System.out.println("零花钱:"+quantity);
System.out.println(p);
//输出结果为重写toString方法
}
}
4.toString方法
当使用print输出一个对象时,就会去这个对象内部查找toString方法,如果没有重写toString方法,就会调用父类的toString方法->打印对象的地址,所以为了实现我们想要的效果,通常会选择重写toString方法
注:快速添加构造方法、setter和getter等的快捷键->Alt+Insert
二.生成一副扑克牌Demo
下面介绍两种方式完成此Demo,一是面向过程,二是面向对象,无论是哪种都需要Poker这个类->生成一张牌,而面向对象则会多一个PokerManager类->管理一副牌,包括生成一副牌、洗牌显示一副牌,这些都是PokerManager的行为即方法
1.面向过程
package Poker;
public class Poker {
String dot;//记录点数
String pic;//记录花色
}
--------------------------------------------------------------------------------------------------
package Poker;
public class Myclass {
public static void main(String[] args) {
//生成一副牌,准备一个数组保存所有的点数
String[] dots=new String[]{"2","3","4","5","6","7","8","9","10","J","Q","K","A"};
//花色
String[] pics=new String[]{"♦","♣","♥","♠"};
//数组保存所有的扑克牌
Poker[] pokers=new Poker[52];
for (int i=0;i<dots.length;i++){
String dot=dots[i];//创建点数
for(int j=0;j<pics.length;j++){
String pic=pics[j];//创建花色
Poker poker=new Poker();
poker.dot=dot;
poker.pic=pic;
pokers[4*i+j]=poker;//添加poker
//每张牌的间隔是4的倍数加上第几个花色
}
}
//输出一副牌
int num=0;
for (Poker poker:pokers){
System.out.print(poker.dot+poker.pic+"\t");
num++;
if(num==4){
System.out.println("");
num=0;
}
}
}
}
2.面向对象
package NewPoker;
public class Poker {
public String dot;//记录点数
public String pic;//记录花色
//准备一个数组保存所有的点数
public static String[] dots=new String[]{"2","3","4","5","6","7","8","9","10","J","Q","K","A"};
//花色
public static String[] pics=new String[]{"♦","♣","♥","♠"};
//添加构造方法
public Poker(String dot, String pic) {
this.dot = dot;
this.pic = pic;
}
//重写toString方法
public String toString() {
return dot+pic;
}
}
--------------------------------------------------------------------------------------------------
package NewPoker;
import java.util.*;
public class PokerManager {
private ArrayList<Poker> Pokers;
public PokerManager(){
Pokers=new ArrayList<>();
}
//生产一副牌
public void generatePokers(){
for (int i=0;i<Poker.dots.length;i++){
String dot=Poker.dots[i];
for (int j=0;j<Poker.pics.length;j++){
String pic=Poker.pics[j];
Poker poker=new Poker(dot,pic);
Pokers.add(poker);
}
}
}
//展示一副牌
public void show(){
int count=0;
for (Poker poker:Pokers){
count++;
System.out.print(poker+"\t");//制表
if(count%4==0){
System.out.println("");//换行
}
}
}
//洗牌
public void shuffle(){
Collections.shuffle(Pokers);//打乱集合中元素的顺序
}
}
--------------------------------------------------------------------------------------------------
package NewPoker;
public class MyClass {
public static void main(String[] args) {
PokerManager P=new PokerManager();
P.generatePokers();//产生一副牌
P.shuffle();//洗牌
P.show();//展示一副牌
}
}
对比总结:第一种写法完全是面向过程的思路,各个功能不够独立化,没有抽出来,写完一个功能就挨着写下一个功能,这是所谓的按功能步骤来执行,修改起来很繁琐,封装性不太好,而面向对象的写法就完全不一样,将各个功能用一个类封装起来,使用的时候很方便,给人的感觉十分清爽,想停用哪个功能就停用哪个功能,检查、修改代码也相对容易