《Java从入门到失业》第四章,Java开发笔试题目

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

  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万”);

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

  • 一个类可以有一个以上的构造器

  • 构造器可以有任意个参数

  • 构造器无返回值

  • 构造器必须和类名同名

《一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》

【docs.qq.com/doc/DSmxTbFJ1cmN1R2dB】 完整内容开源分享

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

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实际上就是美人(这里我们叫玩家)。因为最终座位上坐着的都是人。我们提前编写了一

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
大学java的期末复习资源,试题及答案 1、编译Java Application源程序文件将产生相应的字节码文件,这些字节码文件的扩展名为( )。 A.java B..class C.html D..exe 2、下面哪一项字符序列可以作为合法的标识符( )。 A.true B.null C.2018_year D.$2018year 3、下列选项中,( )不属于Java语言的简单数据类型。 A.整数型 B.数组 C.字符型 D.浮点型 4、对于int a[ ]=new int[3],下列叙述错误的是( )。 A. a.length的值是3 B. a[1]的值是1 C. a[0]的值是0 D. a[a.length-1]的值等于a[2]的值 5、用下列哪个代码替换程序标注的【代码】会导致编译错误? A.m-->0 B.m++>0 C.m = 0 D.m>100&&true; public class E { public static void main (String args[ ]) { int m=10,n=0; while(【代码】) { n++; } } } 6、以下关于继承的叙述正确的是( )。 A. 在Java中类不能多继承 B. 在Java中一个类只能实现一个接口 C. 在Java中一个类不能同时继承一个类和实现一个接口 D. 在Java中接口只能单一继承 7、对于下列Cat类,哪个叙述是错误的?( ) A.Cat类只有 2 个构造方法,而且没有无参数的构造方法 B.Cat类有 4 个构造方法 C.Cat (int m)和 Cat (double m)是互为重载的构造方法 D.int Cat (int m)和 void Cat (double m) 是互为重载的非构造方法 class Cat { Cat (int m){ } Cat (double m){ } int Cat (int m){ return 23; } void Cat (double m){ }} 8、下列叙述哪些是正确的( )。 A final 类可以有子类 B abstract类中只能有abstract方法 C abstract类中可以有非abstract方法,但该方法不可以用final修饰 D 不可以同时用final和abstract修饰一个方法 9、假设D类有如下定义,设d是D类的一个实例对象,下列语句调用错误的是 ( )。 class D{ int i; static String s; void method1(){} static void method2(){}} A.d.method1(); B.D.method2(); C.D.method1(); D.System.out.println(d.i); 10、将下列( )哪个代码替换下列程序中的【代码】不会导致编译错误。 A.public int f(){return 100+M;} B.int f(){return 100;} C.public double f(){return 2.6;}。 D.public abstract int f();

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值