7.4 用实例分析设计一个类的流程

下面将会通过一个综合实例,来总结本章中的一些比较重要的知识,从而总结一下编程思想。

7.4.1 如何在现实程序设计中提取一个类

在现实程序开发过程中,需要根据客户提供的要求来编写程序。在编写程序之前,要分析客户的要求,这是很关键的一步。针对客户的要求,程序员要学会从客户要求中提取出类,然后根据类再创建对象,在对象中规划出方法和属性值,最后,由这些方法和属性值共同完成客户提供的要求。

【实例7.10】下面举一个实例,通过这个实例来证明以上所讲述的步骤。


对于一个班的学生,开发一个学生信息的程序段。其要求如下所示:

(1)男生有10名,女生有15名。请输出他们的姓名、 性别、 学号。

(2)其中张杰是男生,也是班长,请输出其信息。

(3)对所有学生的成绩信息进行输出。

(4)通过班上的成绩,选出最好的学生和最差的学生。

这个实例看起来有点复杂。其实仔细分析应该不是很难。编写程序最关键是程序员的思路,思路清晰了,代码自然很好解决。下面看看如何分析这个实例。

对于这个实例,从所有的要求看来,都是围绕着学生,所以提取一个类,就是学生类。如下:


01 class student

02 {

03 private name;

04 private code;

05 private sexy;

06 private duty;

07 private achievement;

08 }


这个类中的变量是根据实例要求而定义的,这些变量就是类中的属性。再来分析实例中需要程序员做什么事情,而要做的事情就是类中的方法。观察以上的4个要求,主要需要做的事情是输出和排序,那么类的方法中必须要有输出方法和排序方法。

对于第一个要求输出的信息。可以编写下列方法函数。


void print()

{

}


下面再来观察第二个要求、第三个要求,其实也是围绕着学生信息这个数组来输出的。而第四个要求中,要求将所有的数据进行排序,选择出最大的数据和最小的数据。

好了,现在可以开始编写程序了。先来看看此程序的流程图,如图7.1所示。

7.4 用实例分析设计一个类的流程 - 图1

图 7.1 有关类的创建的实例

看下面的代码。


01 ///这是一个学生类

02 ///通过带参数的构造器来构造对象

03 ///通过设置器来设置对象的属性

04 ///通过访问器来访问对象的属性

05 ///tostring是一个将对象以字符串的形式输出的方法

06 public class student

07 {

08 String name="";

09 String code="";

10 String sexy="";

11 String duty="";

12 double achievement;

13 public student(String name)

14 {

15 this.name=name;

16 }

17 18

void set(String name, String code, String sexy, String duty)

19 {

20 this.name=name;

21 this.code=code;

22 this.sexy=sexy;

23 this.duty=duty;

24 }

25 public String getname()//返回姓名

26 {

27 return name;

28 }

29 public String getcode()//返回 学号

30 {

31 return code;

32 }

33 public String getsexy()//返回 性别

34 {return sexy;

35 }

36 public String getduty()//返回职务

37 {return duty;}

38 public void setachi(double achievement)//设置成绩

39 {

40 this.achievement=achievement;

41 }

42 public double getachi()//返回成绩

43 {

44 return achievement;

45 }

46 public void print()//输出

47 {

48 System.out.println("学生"+name+"的成绩是:"+achievement);

49 }

50 51

public String tostring()

52 {

53 String infor="学生 姓名:"+name+";"+"学生 学号:"+code+";"+"学生 性别:"

54+sexy+";"+"学生职务:"+duty;

55 return infor;

56 }

57 ///这是主运行程序

58 ///构造出25个对象。使用带参数的构造器来构造

59 ///再使用设置器来设置对象属性

60 ///使用tostring方法将对象信息输出

61 public static void main(String[]args)

62 {

63 ///构造出学生对象

64 student st1=new student("王浩");

65 student st2=new student("李敏");

66 student st3=new student("李杰");

67 student st4=new student("王杰");

68 student st5=new student("王超");

69 student st6=new student("赵浩");

70 student st7=new student("钱浩");

71 student st8=new student("王松");

72 student st9=new student("朱涛");

73 student st10=new student("张杰");

74 student st11=new student("王敏");

75 student st12=new student("孙洁");

76 student st13=new student("赵丽");

77 student st14=new student("王丽");

78 student st15=new student("钱珍");

79 student st16=new student("王珍");

80 student st17=new student("王萍");

81 student st18=new student("钱萍");

82 student st19=new student("王燕");

83 student st20=new student("赵燕");

84 student st21=new student("孙燕");

85 student st22=new student("孙丽");

86 student st23=new student("林丽");

87 student st24=new student("张丽");

88 student st25=new student("郑丽");

89 ///构造一个学生类的对象数组,将所有的对象放到数组内

90 student[]st=new student[]

91 {st1,st2,st3,st4,st5,st6,st7,st8,st9,st10,st11,st12,st13,st14,st15,st16,st17,st18,st19,st20

92,st21,st22,st23,st24,st25};

93 ///通过设置器对几个对象进行赋值

94 st1.set("王浩","1","男","班员");

95 st2.set("李敏","2","男","班员");

96 st3.set("李杰","3","男","班员");

97 st4.set("王杰","4","男","班员");

98 st5.set("王超","5","男","班员");

99 st6.set("赵浩","6","男","班员");

100 st7.set("钱浩","7","男","班员");

101 st8.set("王松","8","男","班员");

102 st9.set("朱涛","9","男","班员");

103 st10.set("张杰","10","男","班长");

104 st11.set("王敏","11","女","班员");

105 st12.set("孙洁","12","女","班员");

106 st13.set("赵丽","13","女","班员");

107 st14.set("王丽","14","女","班员");

108 st15.set("钱珍","15","女","班员");

109 st16.set("王珍","16","女","班员");

110 st17.set("王萍","17","女","班员");

111 st18.set("钱萍","18","女","班员");

112 st19.set("王燕","19","女","班员");

113 st20.set("赵燕","20","女","班员");

114 st21.set("孙燕","21","女","班员");

115 st22.set("孙丽","22","女","班员");

116 st23.set("林丽","23","女","班员");

117 st24.set("张丽","24","女","班员");

118 st25.set("郑丽","25","女","班员");

119 System.out.println(st1.tostring());

120 System.out.println(st2.tostring());

121 System.out.println(st3.tostring());

122 System.out.println(st4.tostring());

123 System.out.println(st5.tostring());

124 System.out.println(st6.tostring());

125 System.out.println(st7.tostring());

126 System.out.println(st8.tostring());

127 System.out.println(st9.tostring());

128 System.out.println(st10.tostring());

129 System.out.println(st11.tostring());

130 System.out.println(st12.tostring());

131 System.out.println(st13.tostring());

132 System.out.println(st14.tostring());

133 System.out.println(st15.tostring());

134 System.out.println(st16.tostring());

135 System.out.println(st17.tostring());

136 System.out.println(st18.tostring());

137 System.out.println(st19.tostring());

138 System.out.println(st20.tostring());

139 System.out.println(st21.tostring());

140 System.out.println(st22.tostring());

141 System.out.println(st23.tostring());

142 System.out.println(st24.tostring());

143 System.out.println(st25.tostring());

144 ///通过设置器给几个对象进行赋值

145 st1.setachi(87.5);

146 st2.setachi(98);

147 st3.setachi(78);

148 st4.setachi(90);

149 st5.setachi(84);

150 st6.setachi(78);

151 st7.setachi(91);

152 st8.setachi(99.5);

153 st9.setachi(64);

154 st10.setachi(100);

155 st11.setachi(98);

156 st12.setachi(76);

157 st13.setachi(88);

158 st14.setachi(64);

159 st15.setachi(97);

160 st16.setachi(68);

161 st17.setachi(90);

162 st18.setachi(99);

163 st19.setachi(77);

164 st20.setachi(78);

165 st21.setachi(67);

166 st22.setachi(99);

167 st23.setachi(97.5);

168 st24.setachi(92);

169 st25.setachi(88);

170 st1.print();

171 st2.print();

172 st3.print();

173 st4.print();

174 st5.print();

175 st6.print();

176 st7.print();

177 st8.print();

178 st9.print();

179 st10.print();

180 st11.print();

181 st12.print();

182 st13.print();

183 st14.print();

184 st15.print();

185 st16.print();

186 st17.print();

187 st18.print();

188 st19.print();

189 st20.print();

190 st21.print();

191 st22.print();

192 st23.print();

193 st24.print();

194 st25.print();

195 ///通过循环语句对数组元素进行排序

196 for(int i=0;i<st.length;i++)

197 {

198 for(int j=0;j<st.length;j++)

199 {

200 ///通过比较两个元素的大小,如果前面比后面元素大,进行排序

201 if(st[i].achievement<st[j].achievement)

202 {

203 student x;

204 x=st[j];

205 st[j]=st[i];

206 st[i]=x;

207 }

208 }

209 }

210 System.out.println("成绩最好的是:"+st[24].name+",成绩是:"+st[24].achievement);

211 System.out.println("成绩最差的是:"+st[0].name+",成绩是:"+st[0].achievement);

212 }

213 }


【代码说明】这个程序段的主要思路如下所示:

❑先提取一个类即学生类student。

❑根据学生类,创建对象。此时每个同学就是一个学生类的对象。

❑编写设置器和访问器(第25~45行)。(后面会详细讲述它)

❑输出学生信息(第119~143行)。

❑通过循环语句和判断语句对学生成绩进行排序(第196~212行)。

了解上面的思路后,整个程序就很清晰了。剩下的就是对代码的处理。

【运行结果】


学生 姓名:王浩;学生 学号:1;学生 性别:男;学生职务:班员

学生 姓名:李敏;学生 学号:2;学生 性别:男;学生职务:班员

学生 姓名:李杰;学生 学号:3;学生 性别:男;学生职务:班员

学生 姓名:王杰;学生 学号:4;学生 性别:男;学生职务:班员

学生 姓名:王超;学生 学号:5;学生 性别:男;学生职务:班员

学生 姓名:赵浩;学生 学号:6;学生 性别:男;学生职务:班员

学生 姓名:钱浩;学生 学号:7;学生 性别:男;学生职务:班员

学生 姓名:王松;学生 学号:8;学生 性别:男;学生职务:班员

学生 姓名:朱涛;学生 学号:9;学生 性别:男;学生职务:班员

学生 姓名:张杰;学生 学号:10;学生 性别:男;学生职务:班长

学生 姓名:王敏;学生 学号:11;学生 性别:女;学生职务:班员

学生 姓名:孙洁;学生 学号:12;学生 性别:女;学生职务:班员

学生 姓名:赵丽;学生 学号:13;学生 性别:女;学生职务:班员

学生 姓名:王丽;学生 学号:14;学生 性别:女;学生职务:班员

学生 姓名:钱珍;学生 学号:15;学生 性别:女;学生职务:班员

学生 姓名:王珍;学生 学号:16;学生 性别:女;学生职务:班员

学生 姓名:王萍;学生 学号:17;学生 性别:女;学生职务:班员

学生 姓名:钱萍;学生 学号:18;学生 性别:女;学生职务:班员

学生 姓名:王燕;学生 学号:19;学生 性别:女;学生职务:班员

学生 姓名:赵燕;学生 学号:20;学生 性别:女;学生职务:班员

学生 姓名:孙燕;学生 学号:21;学生 性别:女;学生职务:班员

学生 姓名:孙丽;学生 学号:22;学生 性别:女;学生职务:班员

学生 姓名:林丽;学生 学号:23;学生 性别:女;学生职务:班员

学生 姓名:张丽;学生 学号:24;学生 性别:女;学生职务:班员

学生 姓名:郑丽;学生 学号:25;学生 性别:女;学生职务:班员

学生王浩的成绩是:87.5

学生李敏的成绩是:98.0

学生李杰的成绩是:78.0

学生王杰的成绩是:90.0

学生王超的成绩是:84.0

学生赵浩的成绩是:78.0

学生钱浩的成绩是:91.0

学生王松的成绩是:99.5

学生朱涛的成绩是:64.0

学生张杰的成绩是:100.0

学生王敏的成绩是:98.0

学生孙洁的成绩是:76.0

学生赵丽的成绩是:88.0

学生王丽的成绩是:64.0

学生钱珍的成绩是:97.0

学生王珍的成绩是:68.0

学生王萍的成绩是:90.0

学生钱萍的成绩是:99.0

学生王燕的成绩是:77.0

学生赵燕的成绩是:78.0

学生孙燕的成绩是:67.0

学生孙丽的成绩是:99.0

学生林丽的成绩是:97.5

学生张丽的成绩是:92.0

学生郑丽的成绩是:88.0

成绩最好的是:张杰,成绩是:100.0

成绩最差的是:朱涛,成绩是:64.0