《Java从入门到失业》第四章:类和对象(4.3):一个完整的例子带你深入类和对象

本文通过一个麻将游戏的例子,详细介绍了Java中类和对象的概念,包括类的设计、构造器、对象构造、final和static关键字的使用、方法重载以及属性的访问与修改。通过实例,读者将深入理解面向对象编程的核心思想和实践技巧。
摘要由CSDN通过智能技术生成

4.3一个完整的例子带你深入类和对象

       到此为止,我们基本掌握了类和对象的基础知识,并且还学会了String类的基本使用,下面我想用一个实际的小例子,逐步来讨论类和对象的一些其他知识点。

4.3.1需求及分析

       大失叔比较喜欢打麻将,毕竟是国粹嘛,哈哈!因此我打算用一个“自动麻将桌”的小程序来探讨(我相信你们大多数也都会打,如果实在不会,自己百度科普下吧)。需求很简单,说明如下:

  1. 一共136张麻将牌
  2. 西施、王昭君、貂蝉、杨贵妃4个人玩
  3. 座位东固定为庄家
  4. 程序开始运行后,4个人随机落座在东南西北座位,然后麻将桌自动洗牌,洗完后,座位东开始抓牌,按东南西北顺序抓牌。
  5. 4个人都抓完牌后,在控制台打印如下信息:

座位东,庄家,某某某,手牌为:[1万][2万]………

座位南,闲家,某某某,手牌为:[1万][2万]………

座位西,闲家,某某某,手牌为:[1万][2万]………

座位北,闲家,某某某,手牌为:[1万][2万]………

  假如我们用面向过程的方法来做,大概思路为:

  1. 用一个数组M来保存136张麻将
  2. 用数组P来保存4个人名字,同时顺序代表东南西北
  3. 用数组A、B、C、D分别保存座位东、南、西、北座位上的人的手牌
  4. 编写一个落座函数,打乱P的排序
  5. 编写一个洗牌函数,打乱M的排序
  6. 编写一个抓牌函数,往A、B、C、D中添加麻将
  7. 编写一个打印函数,打印结果

  用一张图示意如下:

 

在没有接触面向对象编程之前,很容易就想到类似上面这种思路。但是如果用面向对象的思想来解决这个问题的话,一般怎么做呢?根据我多年的经验,总结几个步骤如下:

  1. 分析需求中涉及到哪些事物、实体以及它们之间的关系
  2. 将事物或实体抽象成类,分析它们会有哪些属性,应该提供哪些方法
  3. 编写程序来实现第2步
  4. 第2、3步会相互迭代,最后解决问题

我们尝试按照上面步骤来分析一下:

  1. 4大美人围着一张麻将桌打麻将,涉及到的实体有:美人、麻将桌、麻将。美人手里会抓麻将;麻将桌会洗牌(即打乱麻将顺序,然后排列好)。
  2. 将实体抽象成麻将类(Mahjong)、桌子类(MahjongTable)、美人类(Player)。然后结合问题的需求和直观感受,我们来分析下每个类具有什么属性和方法。
  3. 对于麻将类,每个麻将都有不同的文字,比如1万、3筒、东风。我们把这个文字叫做文字属性好了。至于方法暂时想不到,先空着。
  4. 对于美人,每个人都有名字属性,其他属性暂时也想不到。都有抓牌这个行为,那么就有一个抓牌方法。另外真实打麻将时,一般都是由庄家来按麻将桌上的洗牌按钮,那么还得有一个发动洗牌的行为。
  5. 对于麻将桌,有4个座位,其实就是坐着4个人,那么可以认为有4个属性:东玩家、南玩家、西玩家、北玩家。其次它拥有一副麻将,可以用一个数组来存放这副麻将,就是麻将数组属性。行为显而易见,得提供一个洗牌的功能,供庄家启动。

我们用一张图来把上面的分析示意一下:

 

4.3.2源文件与类

  接下来,我们开始编写这些类。第一个知识点来了,在Java中,如何编写多个类?之前我们只写过一个HelloWorld的类,现在需要写3个类,是放在一个文件中,还是放在3个文件中呢?事实上,在Java中,关于源文件和类,有如下约定:

  • 一个源文件中可以有一个或多个类
  • 一个源文件中可以没有公有类
  • 当一个源文件中有多个类的时候,最多只能有一个类被public修饰,即只能有一个公有类
  • 当源文件中有公有类时,源文件的命名必须和这个公有类名一致。
  • 当源文件中没有公有类时,源文件的命名可以任意命名为符合命名规范的名字

是不是觉得挺绕的?事实上,我们在实际工作运用中,一般习惯一个类对应一个源文件,只有在极少数情况下才会把多个类放在一个源文件中。在这个例子中,我们将编写3个源文件来对应这3个类。

4.3.3编写麻将类

       一般情况下,我们编写一个类的步骤分3步:定义类名、编写属性、编写方法。上面我们还提到过公有类,当一个类被public修饰符修饰的时候,这个类就是公有类,公有类可以被整个程序中任意一个其他类引用,具体关于类的修饰后面会讨论。定义一个类的基本格式如下:

修饰符 class 类名{

       属性

       构造方法

       其他方法

}

我们按照这个格式,先编写麻将类,从示意图上我们看到,麻将类很简单,只有一个属性,没有方法:

public class Mahjong {  
    private String word;// 麻将的文字  
  
    /** 
     * 构造方法 
     * @param word 该麻将的文字 
     */  
    public Mahjong(String word) {  
        this.word = word;  
    }  
}  

4.3.4构造器

       我们看到,麻将类的类名我管它叫Mahjong(这是麻将的英文翻译),它符合标识符的规定(还记得标识符的规定吗?不记得了回去翻看3.2)。然后有一个构造器方法,构造器方法和类名同名,接受一个String类型的参数。前面我们学习String类的时候,String类有15个构造器方法,同时我们也学习了如何构造一个新的对象,就是使用new关键字。我们要创建一个Mahjong对象,就可以用如下语句:

Mahjong m = new Mahjong("8万");

现在,我们再补充一下关于构造器的一些知识点:

  • 一个类可以有一个以上的构造器
  • 构造器可以有任意个参数
  • 构造器无返回值
  • 构造器必须和类名同名

另外,我们看到,在构造器中只有一句代码:

this.word = word; 

目的就是将新构造出来的对象的word属性的值设置为传进来的值。因为方法的参数名字和属性名字重复了,为了加以区分,用到了this关键字。this代表对象本身。关于this的用法以后还会讲解。

4.3.5编写麻将桌类

       有了麻将类后,我们继续编写麻将桌类。麻将桌类相对复杂,它具有5个属性和1个方法,我们先编写一个大概出来:

public class MahjongTable {  
    // 座位东上的玩家  
    private Player dong;  
    // 座位南上的玩家  
    private Player nan;  
    // 座位西上的玩家  
    private Player xi;  
    // 座位北上的玩家  
    private Player bei;  
    // 一副麻将  
    private Mahjong[] mahjongArray;  
  
    // 构造方法  
    public MahjongTable() {  
  
    }  
  
    // 洗牌方法  
    public void xipai() {  
  
    }  
}  

首先我们看到,对于座位东南西北,我们都是Player类型的。Player实际上就是美人(这里我们叫玩家)。因为最终座位上坐着的都是人。我们提前编写了一个空的Player类(代码后面展示),以便于编写麻将桌类不会出现编译错误。

接着,我们来完善一下构造方法。我们想一下,对于一张麻将桌,它其实可能存在几种情况:

  • 一张空桌子,桌子上没有麻将,凳子上也没有人
  • 桌子上有麻将,凳子上没有人
  • 桌子上有麻将,凳子上坐好了人,准备开打

因此,我们可能需要提供3个构造器,代码如下:

    // 构造方法  
    public MahjongTable() {  
  
    }  
  
    // 构造方法  
    public MahjongTable(Mahjong[] mahjongArray) {  
        this.mahjongArray = mahjongArray;  
    }  
  
    // 构造方法  
    public MahjongTable(Mahjong[] mahjongArray, Player dong, Player nan, Player xi, Player bei) {  
        this(mahjongArray);  
        this.dong = dong;  
        this.nan = nan;  
        this.xi = xi;  
        this.bei = bei;  
    } 

 

4.3.6对象的构造

       我们编写麻将类的时候,知道如何编写一个简单的构造器,用来构造一个对象,同时对对象的属性进行初始化。但是编写麻将桌类的时候,发现有时候一个构造器不能满足需求,因此Java提供了多种编写构造器的方式,这里我们将进一步讨论一下。

4.3.6.1默认构造器及默认属性

       我们注意到,麻将桌类的第一个构造器没有任何参数,像这种构造器,我们称之

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值